将BGRA像素转换为灰度

时间:2018-07-26 12:57:58

标签: c++ opencv rgb grayscale color-space

我正在尝试将像素(4通道)转换为其灰度值。

图像看起来像是喷射色图:

enter image description here

并且我正在尝试将其转换为此:

enter image description here

当我将其转换时,我想通过其灰度值将透明度设置为原始。我的转换如下:

uchar v = (inMat.at<cv::Vec4b>(i,j)[0]*0.07f) + 
          (inMat.at<cv::Vec4b>(i,j)[1]*0.72f) + 
          (inMat.at<cv::Vec4b>(i,j)[2]*0.21f);

我认为这些值(0,07;0,72;0,21)会转换它们,但是它将像素转换为更像这样的东西:

enter image description here

我应该使用什么值来正确转换?

3 个答案:

答案 0 :(得分:2)

Jet颜色图与其他许多颜色图一样,会将灰度值映射到一种颜色,但是与它们无关,您可以将其转换为灰度并获取初始值。

如果要获取从喷射彩色图到灰度的映射,可以执行以下操作:

cv::Mat a(255, 1, CV_8U), b;
for (int i = 0; i < 255; ++i)
{
  a.at<uchar>(i) = i;
}
cv::applyColorMap(a,b,cv::COLORMAP_JET);

现在,您就像在Jet颜色图和灰度值之间的映射...您只需要在b中找到颜色,位置就可以告诉您a中的颜色。不确定找到颜色的最快方法是什么,但是从十六进制颜色到灰度值的映射也许很好。

答案 1 :(得分:0)

基本上,您的图片是从0-> 240度的色相渐变(不是完整的圆圈,因为其中没有紫色)。因此,您需要找到一个rgb->色相公式。例如,尝试this question的答案。

一旦找到色相值,亮度为色相/240.0;

也许您需要对生成的图像应用伽玛校正。

答案 2 :(得分:-3)

我不知道CV,但是对于灰度,您只求平均值r,g,b

Average = (R + G + B) / 3
R = Average
G = Average
B = Average