使用OpenCV修改图像时RGB值错误

时间:2013-11-04 01:40:58

标签: c++ opencv image-processing

C ++相当新,我一直在使用OpenCV库。我试图为图像查看器创建一个调光功能。这是void dim(int val)的主体。

我循环遍历每个像素,获取对Vec3b内像素的RGB值的引用,然后根据val / 2550 <= val <= 255计算的某个变化因子减少它们。出于某种原因,pix[0]等都被设置为0,这意味着对于val的任何值,图像都会变黑。

可能会在这里浮点数略微愚蠢,或者误解OpenCV的某些方面;但是我看不出它是什么。

for(int x = 0; x < rows; x++) {
    for(int y = 0; y < cols; y++) {
        Vec3b &pix = dst.at<Vec3b>(x,y);

        float change = val / 255.0f;
        pix[0] = (uchar)(pix[0] * change);
        pix[1] = (uchar)(pix[1] * change);
        pix[2] = (uchar)(pix[2] * change);
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

OpenCV有一个关于changing the contrast and brightness of an image的文档。一般来说,它会将alpha * pixel_value + beta应用于每个像素。由于您只需要调整图像的亮度,因此alpha可以设置为1.0。以下是修改后的dim()函数。

// negative beta dims image
void dim(Mat& src, Mat& dst, int beta) {
    for(int y = 0; y < src.rows; y++) {
        for(int x = 0; x < src.cols; x++) {
            for(int channel = 0; channel < 3; channel++) {
                dst.at<Vec3b>(y, x)[channel] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[channel] + beta);
            }
        }
    }
}

如果感兴趣,请阅读saturate_cast所做的事情。

测试上述功能:

int main( int argc, char** argv )
{
    int beta;
    Mat src = imread(...);
    Mat dst = Mat::zeros(src.size(), src.type());
    namedWindow("src", CV_WINDOW_AUTOSIZE);
    imshow("src", src);
    dim(src, dst, -200);
    namedWindow("dst", CV_WINDOW_AUTOSIZE);
    imshow("dst", dst);

    waitKey(0);
    return 0;
}

答案 1 :(得分:0)

如果将整数值乘以/除以小于1的实数值,则得到0,因为缩放系数将被截断为整数。 要纠正您的问题,您应该将pix []转换为float或double,然后将其转换为char。