将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/
答案 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来比较像素值。
干杯