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

Posted

技术标签:

【中文标题】使用 OpenCV 修改图像时 RGB 值错误【英文标题】:Wrong RGB values when modifying image with OpenCV 【发布时间】:2013-11-04 01:40:58 【问题描述】:

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

我循环遍历每个像素,获取对 Vec3b 中像素的 RGB 值的引用,然后将它们减少一些变化因子,根据 val / 255 计算(其中 0 <= val <= 255。但由于某种原因,@987654324 @等都被设置为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);
    

提前致谢!

【问题讨论】:

我测试了你的代码,它工作正常!不要将val 设置得太小,否则dst 的结果会变成全黑。 你可以做dst *= val/255.0f。此外,看起来您的索引错误。你应该有x &lt; colsy &lt; rows 为这个速记的提示干杯。我不明白索引是如何出错的,当前配置工作正常,如果我切换变量,它只会使图像的一部分变暗。 【参考方案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;

【讨论】:

【参考方案2】:

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

【讨论】:

我尝试将每个 pix[] 值转换为浮动,但没有区别。

以上是关于使用 OpenCV 修改图像时 RGB 值错误的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 读写图像读写像素修改像素值(案例:图像反处理)

OpenCV Tiff 错误的颜色值读数

OpenCV:如何为每个像素填充具有每种 RGB 颜色值的 rgb 图像?

想要从图像中获取绿色 RGB 通道时出错

在openCV中访问某个图像中所有像素的RGB值

opencv图像的基本操作3