Вопрос

У-у-у, слава богу, теперь я пришел к пониманию массивов.

Теперь у меня есть 2 массива!

int colorvalues[][]  = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

Представьте это как картинку размером 4х4 пикселя

Теперь я хочу создать гистограмму, распределение цветовых значений от 0 до 255.Например, здесь у меня есть 2*255, 2*127, 5*34 и так далее.

Итак, я создал гистограмму int[] = new int [255];

Чтобы проверить, верны ли мои цветовые значения, я написал:

 for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
         System.out.println("Colorvalue in Array " + i + "." + j + " is" + colorvalues[i][j]);
     }
 }

Пока все идет так хорошо.Теперь, как мне написать процедуру, которая переходит в histogram [255] от 0 до 255 и сравнивает ее со значением colorvalues[][], и если, например, histogram[34] сравнивается с colorvalues[][], она добавляет 5 к histogram [34].Потому что в colorvalues 5 раз по 34[][].

Возможно, мое мышление неверно, и я должен был иметь гистограмму [255] [], 255 для значений цвета от 0 до 255 и другую для счетчика.Но даже тогда, как мне это осознать?

Это было полезно?

Решение

На самом деле вам не следует перебирать гистограмму и для каждого возможного значения перебирать изображение.Повторения по изображению должно быть достаточно:

for(int i=0; i < colorvalues.length; i++){
     for (int j = 0; j < colorvalues.length; j++){
             histogram[colorvalues[i][j]]++;
     }
}

Вы можете просто использовать значение яркости в вашем изображении в качестве Указатель в массив гистограмм.

И вам не нужно создавать массив массивов только для сохранения счетчика.Помните, что массив - это не что иное, как список "ячеек" для определенного значения.ан int[] это просто диапазон "ячеек", которые могут содержать целочисленное значение.Это ваш счет.Тот самый Указатель в этом списке ячеек указано ваше значение яркости для гистограммы.Для каждого массива у вас есть эти две части информации:Индекс ячейки и значение в этой ячейке.Вам просто нужно выяснить, как использовать и то, и другое.

И как Скорость PSpeed примечания в комментарии, возможно, вы захотите убедиться, что код на самом деле не будет пытаться получить доступ к значениям за пределами этого массива:

if (colorvalues[i][j] >= 0 && colorvalues[i][j] <= 255) {
    histogram[colorvalues[i][j]]++;
}

Это необходимо, потому что ваши значения цвета следующие ints, то есть они могут содержать значения от -2147483648 до 2147483647.Это намного больший диапазон, чем может вместить ваша гистограмма.Таким образом, если значение цвета окажется, например, равным 3456, программа остановится в цикле из-за ArrayIndexOutOfBoundsException.Поскольку код trid для доступа к значению в histogram массив с индексом 3456, который намного превышает максимально допустимый индекс 255.

ETA: Что касается вашей гистограммы, являющейся int[255]:Я совершенно упустил это из виду, извини.При создании нового массива в Java вы указываете длина, а не максимальный индекс.Таким образом, все, что вы там используете, ровно на единицу больше максимального индекса, который может быть использован в массиве.Итак new int[256] представляет собой массив с индексами от 0 до 255.

Другие советы

У меня было бы желание добавить значения гистограммы в древовидную карту, где ключ карты - это значение цвета, а значение карты - это количество.

Карта автоматически увеличится в размерах, никаких проблем с выходом индекса за пределы и т.д.он будет автоматически отсортирован по размеру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top