OpenCV cvtColor()使用哪种灰度转换算法?

24

在OpenCV中将图像从彩色转换为灰度图时,使用哪种转换算法?我试图在GitHub的源代码中查找,但没有任何成功。

亮度方法平均最突出和最不突出的颜色:

  (max(R, G, B) + min(R, G, B)) / 2.

平均方法简单地对值进行平均:

  (R + G + B) / 3.

亮度法是平均法的一种更加复杂的版本。它也对数值进行平均,但形成了加权平均以考虑人类感知。我们对绿色比其他颜色更敏感,因此绿色受到最重的加权。

    The formula for luminosity is 0.21 R + 0.72 G + 0.07 B.

这里是一些转换算法的示例: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/


1
你的亮度公式为什么在G因子(0.71 vs. 0.72)的系数上与参考文献不同 - 这是一个笔误还是故意的? - Wolf
其他读者请注意:Wolf上面的评论已经不适用了。错别字已经被更正。当我第一次阅读时,我感到困惑,认为必须是源使用0.71作为G的权重。由于0.21 + 0.72 + 0.07总和为1,这是有问题的。源和帖子都使用0.72。希望这个评论能为您节省几分钟。 - Allison B
2个回答

32
这个算法将颜色转换为灰度,详见cvtColor()文档(搜索RGB2GRAY)。该算法的公式与CCIR 601相同:

Y = 0.299 R + 0.587 G + 0.114 B

你提供的亮度公式适用于ITU-R建议BT. 709。如果需要,请在cvtColor()的第三个参数中指定CV_RGB2XYZ,然后提取Y通道。
你可以通过进行CV_RGB2HLS转换并提取L通道来使用OpenCV执行你描述的“亮度”方法。我不认为OpenCV有“平均”方法的转换,但是如果你查看文档,会发现还有其他几种可能性。

1
只是想指出:

img = cv2.imread(rgbImageFileName)
b1 = img[:,:,0] # Gives **Blue**
b2 = img[:,:,1] # Gives Green
b3 = img[:,:,2] # Gives **Red**

另一方面,将其作为数字数组加载可以正常工作:
imgArray= gdalnumeric.LoadFile(rgbImageFileName)
Red = imgArray[0, :, :].astype('float32')
Green = imgArray[1, :, :].astype('float32')
Blue = imgArray[2, :, :].astype('float32')

因此,请注意这些奇怪的事情。

但是在转换为灰度图像时,cv2.cvtColor 正确地使用了波段。我使用 Matlab 的 rgb2gray 比较了像素值。

干杯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接