изображение — Grayscale C ++ с OpenCV (появляется шум)

У меня есть некоторые проблемы с преобразованием в оттенки серого с использованием 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;
}
}

но результаты не работают должным образом, в нем появляется какой-то шум.
появляется некоторый шум изображения в градациях серого

Я до сих пор не нашел, где код, который делает ошибку. 🙁
спасибо раньше.

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]