Я пытаюсь распечатать гистограмму значений, которые соответствуют количеству раз, когда значение пикселя появляется в файле .pgm. Я знаю, что правильно читаю значения, это когда я пытаюсь распечатать их там, где у меня есть проблемы.
int pixelHold[product];
for(long int i = 0; i < product; i++)
{
pixelHold[pixels[i]]++;
//cout << pixels[i] << ' ' << endl;
}
for(long int j = 0; j < product; j++)
{
cout << pixelHold[j] << ' ';
}
«product» — это значение пикселя Width x Height, которое соответствует размеру вектора, который я использую для хранения всех значений. «pixelHold» — это просто массив, который я использую для увеличения каждый раз, когда встречается значение пикселя. Например, если он встретил «222» 3 раза, он напечатал бы «3» для слота «222».
Однако проблема в том, что, когда я печатаю гистограмму, я получаю кучу нулей, а затем мусор для последних 100 слотов или около того. Когда я изменяю параметры цикла for на меньшее число, например «221», он выводит правильную гистограмму до этой точки.
Любая помощь высоко ценится!
Вам всегда нужно инициализировать ваши массивы — иначе они содержат абсолютно произвольное содержимое — содержимое ОЗУ, куда компилятор решил поместить ваш массив.
Кроме того, ваша таблица гистограмм должна иметь размеры 256 — так как это количество (8-битных) цветов в изображении в оттенках серого.
Следующий код должен сделать трюк:
const int histogramLevels = 256;
int pixelHold[histogramLevels];
for (int i=0; i<histogramLevels; i++) pixelHold[i] = 0;
for(long int i = 0; i < product; i++)
{
pixelHold[pixels[i]]++;
//cout << pixels[i] << ' ' << endl;
}
for (int i=0; i<histogramLevels; i++) {
cout << pixelHold[j] << ' ';
}
Других решений пока нет …