将 BGRA 像素转换为灰度

Convert BGRA pixel to grayscale

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

图像看起来像喷射色图:

我正在尝试将其转换为:

当我转换它时,我想通过它的灰度值将透明度设置为原始的。我的转换看起来像这样:

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) 会转换它们,但它会将像素转换为看起来更像这样的东西:

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

我不知道开放式 CV,但对于灰度,您只需平均 r、g、b

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

基本上你的图片是一个色调渐变,从 0 -> 240 度(不是一个完整的圆,因为里面没有紫色)。所以你需要找到一个 rgb -> hue 公式。例如,尝试 this question 的答案。

一次,您找到了色相值,亮度为 hue/240.0;

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

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

如果你想获得从 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 中的等效颜色。不确定找到颜色的最快方法是什么,但也许从十六进制颜色到灰度值的映射会很好。