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



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

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

Y = 0.299 R + 0.587 G + 0.114 B

您给出的亮度公式适用于ITU-R建议书BT.709。如果需要,可以在第三个参数中指定CV_RGB2XYZ(例如)cvtColor()然后提取Y通道。

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

只是想指出:

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

干杯

最新更新