原始图像上的独立颜色转换

时间:2014-05-05 09:59:06

标签: image opencv image-processing colors computer-vision

我想使用opencv c++执行独立颜色转换,我理解我的场景,但我不知道使用opencv执行其实现的顺序。我想让我解释一下我的情景以获得进一步的帮助。

我想逐个像素地对原始图像执行独立的RGB颜色转换,以增加对比度或使用opencv进行色彩转换。上面independent transformation表示两件事:

首先,一个颜色通道的值不会影响其他通道的值。

其次,不同位置的像素不会相互影响。

所以颜色转换可以用这样的表达式来解释:

Rxy' = transformRedChannel(Rxy, x, y)

Gxy' = transformGreenChannel(Gxy, x, y)

Bxy' = transformBlueChannel(Bxy, x, y)

在上面的表达式中,Rxy代表原始图像中位置(x,y)处像素的红色通道值,范围为0~255,Rxy'代表在目标图像中。蓝色和绿色通道也是如此。

由于该功能可以用[0,255] - >来描述。 [0,255]映射数组,使用255个不同的灰度图像生成映射数组很容易。

1 个答案:

答案 0 :(得分:0)

访问图像的RGB值可以通过Accessing certain pixel RGB value in openCV

中显示的方法完成
valRed   = image.at<cv::Vec3b>(row,col)[0]; //R
valGreen = image.at<cv::Vec3b>(row,col)[1]; //G
valBlue  = image.at<cv::Vec3b>(row,col)[2]; //B

使用以下方法计算新值并将其写入另一个图像:

image.at<cv::Vec3b>(row,col)[0] = newval[0];  //R
image.at<cv::Vec3b>(row,col)[1] = newval[1];  //G
image.at<cv::Vec3b>(row,col)[2] = newval[2];  //B

或者,如果你真的想使用分割(并创建3个新图像,每个通道一个),你可以使用它:

split(img , colors);

读:

valRed   = colors[0].at<uchar>(row,col)
valGreen = colors[1].at<uchar>(row,col)
valBlue  = colors[2].at<uchar>(row,col)

写:

colors[0].at<uchar>(row,col) = newValRed;    //R
colors[1].at<uchar>(row,col) = newValGreen;  //G
colors[2].at<uchar>(row,col) = newValBlue;   //B