2013-11-19 2 views
1

У меня есть проблема с преобразованием в оттенки серого с помощью openCV, чтобы выполнить ручную функцию. И это мой код.Оттенки серого C++ с OpenCV (появляется некоторый шум)

main.cpp

unsigned int height, width; 
int main(int argc, char** argv) 
{ 

    IplImage* image_input = cvLoadImage("duck.jpg", CV_LOAD_IMAGE_UNCHANGED); 
    IplImage* image_output = cvCreateImage(cvGetSize(image_input),IPL_DEPTH_8U,1); 

    unsigned char *h_out = (unsigned char*)image_output->imageData; 
    unsigned char *h_in = (unsigned char*)image_input->imageData; 

    width  = image_input->width; 
    height = image_input->height; 

    h_grayscale(h_in, h_out); 

    cvShowImage("Original", image_input); 
    cvShowImage("CPU", image_output); 
    cvReleaseImage(&image_input); 
    cvReleaseImage(&image_output); 
    waitKey(0); 
} 

в этой моей градации серого кода.

void h_grayscale(unsigned char* h_in, unsigned char* h_out) 
{ 
for(int i=0;i<height;i++){ 
    for(int j=0;j<width;j++){ 
     int index = (i*j)*3; 
     double temp = 0.3*h_in[index]+0.6*h_in[index+1]+0.1*h_in[index+2]; 
     h_out[i*j] = (unsigned char)temp; 
    } 
} 

но результаты не работают должным образом, в нем появляется некоторый шум. appears some noise of grayscale image

Я до сих пор не нашел код, который делает ошибку. :( ТНХ раньше.

ответ

1

Вы расчета входных и выходных индексов неправильно. Первый пункт, чтобы помнить при работе с OpenCV изображений является то, что они совпадут, то есть каждая строка заполняется в конце с некоторыми случайными значениями. Таким образом, при расчете линейного индекса пикселя в цветной и черно-белых изображениях, widthStep должен быть использован вместо width

родовой формула для вычисления индекса пикселя:.

i * widthStep/sizeof(type) + (channels * j) 

Где i это номер строки , и j - номер столбца.

Переводя выше формулу для текущего случая, индексы будут рассчитываться следующим образом:

Вход:

int index = i * colorWidthStep + (3 * j); 

Выход:

h_out[i * grayWidthStep + j] = (unsigned char)temp; 

Вы можете создать 2 дополнительных глобальных переменных colorWidthStep и grayWidthStep, а также width и height. Инициализировать переменные следующим образом:

width  = image_input->width; 
height = image_input->height; 
colorWidthStep = image_input->widthStep; 
grayWidthStep = image_output->widthStep; 
+0

спасибо, его работы. но я хочу спросить о функции witdhstep? и почему он должен сделать две ширины для ввода и вывода? Прошу прощения, я все еще начинаю об обработке изображений. < – bagusbekam

+2

Widthstep - это фактическая ширина изображения (по ** фактическому **, я имею в виду физическое запоминание в ОЗУ), измеренное в ** байтах **, а не в ** пикселях **. Если 1 пиксель полутонового изображения составляет 1 байт, тогда 1 пиксель цветного изображения RGB будет 3 байта. Это означает, что widthStep изображения RGB будет ** по крайней мере ** в 3 раза больше, чем изображение в градациях серого одинаковой ширины. Посмотрите на [this] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa473780 (v = vs.85) .aspx). ** WidthStep ** также называется ** Stride **. – sgarizvi

+0

@bagusbekam ... Вы можете принять ответ, если он решает проблему. – sgarizvi