增加光度不会产生预期的效果

时间:2014-03-01 11:31:35

标签: c opencv image-processing luminance

    cvCvtColor(img,dst,CV_RGB2YCrCb);
    for  (int col=0;col<dst->width;col++) 
    { 
        for (int row=0;row<dst->height;row++) 
        { 
            int idxF = row*dst->widthStep + dst->nChannels*col; // Read the image data 
            CvPoint pt = {row,col};
            temp_ptr2[0] += temp_ptr1[0]* 0.0722 + temp_ptr1[1] * 0.7152 +temp_ptr1[2] *0.2126  ;   // channel Y 
        }
    }

但结果如下:

enter image description here

请协助我哪里出错?

1 个答案:

答案 0 :(得分:1)

对此代码示例有很多

  • 首先,您使用旧的C风格的API(IplImage指针,cvBlah函数等),这已经过时且难以维护(特别是内存泄漏是很容易介绍),所以你应该考虑使用C ++风格的结构和函数(cv::Mat结构和cv::blah函数)。

  • 您的错误可能来自最初的说明cvCopy(dst,img);。这会在您开始处理之前没有任何内容填充您的输入图像,因此您应该删除此行。

  • 为了获得最大速度,您应该反转两个循环,以便首先遍历行然后遍历列。这是因为OpenCV中的图像逐行存储在内存中,因此通过增加列来访问图像在缓存使用方面更有效。

  • 永远不会使用临时变量idxF,因此您也应该删除以下行:

    int idxF = row*dst->widthStep + dst->nChannels*col;
    
  • 当您访问图像数据以存储temp_ptr1temp_ptr2中的像素时,您交换了xy坐标的位置。您应该按以下方式访问图像:

    temp_ptr1  = &((uchar*)(img->imageData + (img->widthStep*pt.y)))[pt.x*3];
    
  • 您永远不会释放为dst分配的内存,因此会在您的应用程序中引入内存泄漏。在功能结束时致电cvReleaseImage(&dst);