OpenCV cvtColor()使用什么灰度转换算法?

时间:2013-10-04 12:36:08

标签: algorithm opencv grayscale

将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/

2 个答案:

答案 0 :(得分:21)

灰度算法的颜色在cvtColor() documentation中说明。 (搜索RGB2GRAY)。 使用的公式与CCIR 601相同:

  

Y = 0.299 R + 0.587 G + 0.114 B

您提供的发光度公式适用于ITU-R BT建议书。 709.如果您愿意,可以在CV_RGB2XYZ的第三个参数中指定cvtColor()(例如),然后提取Y频道。

您可以通过执行CV_RGB2HLS转换,然后提取L通道,让OpenCV执行您描述的“亮度”方法。我不认为OpenCV有“平均”方法的转换, 但如果您浏览文档,您会发现还有其他一些可能性。

答案 1 :(得分:0)

只想指出:

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来比较像素值。

干杯