2015-12-01 1 views
0

я написал небольшую программу, чтобы определить гистограмму изображения как часть моей задачи:гистограмма код в C++ показывает некоторые сумасшедшие неожиданные цифры

void histogram(const SimpleGrayImage &img, long (&tab)[256]) { //SimpleGrayImage is a given class from our prof 
int val = 0; 
int count = 1; 

while (val < 256) { 
    for (int i = 0; i < img.height(); i++) { 
     for (int j = 0; j < img.width(); j++) { 
      if (val == img[i][j]) { //with img[][] you can get the integer value (between 0<256) 
       tab[val] = count; 
       count++; 
      } 
     } 
    } 
    count = 0; 
    val++; 
} 

}

в следующем шаге я собираюсь распечатать массив:

int main(){ 

SimpleGrayImage img(RESOURCES_PATH "/black.pgm"); //loads a black image with the resolution of 512x512 
long arr[256]; 

histogram(img, arr); 

for(int j=0;j<256;j++){ 
    cout<<"grey tone: "<<j<<" count: "<<arr[j]<<"\n"<<endl; 
} 

}

, когда я запустить эту программу консоль дает правовая информация:

grey tone: 0 count: 262144 

. . .

другие серые тона (от 1-235) также дает нужную информацию (0), а затем консоль показать некоторые сумасшедшие цифры и я не могу объяснить, почему это происходит:

grey tone: 236 count: 288392707021528753 
grey tone: 237 count: 140734701956328 
grey tone: 238 count: 21 
grey tone: 239 count: 1 
grey tone: 240 count: 4392816744 
grey tone: 241 count: 140734851732223 
grey tone: 242 count: 140734701956144 
grey tone: 243 count: 140734851576438 
grey tone: 244 count: 140734701956176 

. . .

так что вы, ребята, можете мне помочь в решении моей проблемы. спасибо :)

+0

Ответ выполнен правильно. Также вы должны проверить свой метод. Внешний цикл while не нужен. –

ответ

2

Если какое-то значение вообще не существует, то факт, что вы не инициализируете массив нулями, поражает вас.

Try что-то вроде:

long arr[256]; 
for (int i = 0; i < 256; i++) { 
    arr[i] = 0; 
} 
histogram(img, arr); 

или альтернативно обрабатывать инициализацию внутри вашей histogram функции.

+0

Спасибо Pukku !! теперь он отлично работает :) Большое вам спасибо! – Marquoo

1

Вы забыли инициализировать свой массив. Таким образом, вы печатаете несколько фрагментов памяти, где вы не можете знать, есть ли значение или нет.

Запустите этот код, чтобы инициализировать arr, прежде чем звонить histogram.

for (int i = 0; i < 256; i++) 
    arr[i] = 0;