我想使用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个不同的灰度图像生成映射数组很容易。
答案 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