У меня есть некоторые проблемы с преобразованием в оттенки серого с использованием 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;
}
}
но результаты не работают должным образом, в нем появляется какой-то шум.
Я до сих пор не нашел, где код, который делает ошибку. 🙁
спасибо раньше.
Вы неправильно рассчитываете входные и выходные индексы.
Первое, что следует помнить при работе с изображениями 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;
Других решений пока нет …