Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将BGRA像素转换为灰度_C++_Opencv_Rgb_Grayscale_Color Space - Fatal编程技术网

C++ 将BGRA像素转换为灰度

C++ 将BGRA像素转换为灰度,c++,opencv,rgb,grayscale,color-space,C++,Opencv,Rgb,Grayscale,Color Space,我正在尝试将像素(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.

我正在尝试将像素(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);
ucharv=(inMat.at(i,j)[0]*0.07f)+
(国际海事法院判例汇编(i,j)[1]*0.72f)+
(国际海事法院判例(i,j)[2]*0.21f);
我原以为这些值(
0,07;0,72;0,21
)会转换它们,但它会将像素转换成更像这样的东西:

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);


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

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

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

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

找到色调值后,亮度为色调/240.0


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

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

如果要获得从jet colormap到灰度的映射,可以执行以下操作:

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);
材料a(255,1,cv_8U),b; 对于(int i=0;i<255;++i) { a、 at(i)=i; } cv::applyColorMap(a、b、cv::COLORMAP_-JET);
现在你有了一个喷射颜色贴图和灰度值之间的映射。。。您只需在
b
中找到颜色,位置就会告诉您
a
中的等效颜色。不确定查找颜色的最快方法是什么,但可能从十六进制方式的颜色到灰度值的映射会很好。

看起来转换正确。它是两端都有渐变的源图像。也许你想将颜色值映射到灰度级?@VTT我知道,但我只需要向一端渐变,就像在第二张图像中一样-最深的蓝色是黑色,最深的红色是白色如果你想映射值,那么你需要从左到右迭代,并将每种颜色映射到索引,如
(0,0143)->0;(0,0,159) -> 1; ...听起来像是要从RGB转换为HSV并使用色调值(可能?)标准灰度转换将某些RGB值的亮度转换为单个值。深红色相当深,深蓝色相当深,因此您的结果是有意义的。要将顶部图像转换为某种黑白渐变,我将使用LUT,只需在顶部图像的一行上迭代,将像素值添加到LUT,并将迭代索引(从0到255或从0到1,取决于结果类型)作为LUT的结果。和VTT说的一样。这是真的,但我需要具体的转换,正如问题中指定的“平均r,g,b”和“灰度”不一样。就是这样,我用色调计算,但这个“查找”更快,谢谢!