【发布时间】:2014-06-21 14:11:18
【问题描述】:
我想使用 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 个不同灰度图像生成映射数组。
【问题讨论】:
-
这应该非常简单,因为 openCv 允许轻松访问像素。例如,请参阅stackoverflow.com/questions/8932893/…。您应该创建一个与输入大小相同的新图像,然后遍历所有像素并为每个像素的每个通道调用转换函数。请发布您在此过程中遇到的问题。
-
是的,但我希望我应该从像素的原始值继续,而不是从 (0,0,0)
-
我不太明白你的评论。如果你从你的'sourceImage'计算你的'destinationImage',除了你的'transformation(sourcePixel)'是(0,0,0)
-
是的,这就是我所说的,我如何计算我的源图像颜色值?我知道
split函数,但是当我们绘制颜色滚动条时,我们得到 3 种颜色的 9 个值,但在拆分函数中,我们使用 3 个值来完成 -
您的源图像是图像。您使用 OpenCv 作为彩色图像(不是灰度)加载图像。然后您可以使用 'image.at<:vec3b>(y,x)[0]; 访问 RGB 值。 image.at<:vec3b>(y,x)[1]; image.at<:vec3b>(y,x)[2];'并计算您的新值并将它们写入另一个图像:'image.at<:vec3b>(y,x)[0] = newval[0]; image.at<:vec3b>(y,x)[1] = newval[1]; image.at<:vec3b>(y,x)[2] = newval[2];'
标签: image opencv image-processing colors computer-vision