У меня есть проблема с преобразованием в оттенки серого с помощью 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;
}
}
но результаты не работают должным образом, в нем появляется некоторый шум.
Я до сих пор не нашел код, который делает ошибку. :( ТНХ раньше.
спасибо, его работы. но я хочу спросить о функции witdhstep? и почему он должен сделать две ширины для ввода и вывода? Прошу прощения, я все еще начинаю об обработке изображений. < – bagusbekam
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
@bagusbekam ... Вы можете принять ответ, если он решает проблему. – sgarizvi