【问题标题】:Independent colour transformation on the original image对原始图像进行独立的颜色变换
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 喜欢image.at&lt;cv::Vec3b&gt;(13,20)[0] += 50;,如果我想在13,20像素位置添加例如50值
  • 是的,我将 x,y 更改为 row,column 以明确顺序。你可以在这里阅读更多内容:docs.opencv.org/doc/user_guide/…
  • 如果您仍然需要帮助,请发布您正在处理的实际代码
猜你喜欢
  • 2015-05-11
  • 2014-05-09
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多