【问题标题】:What grayscale conversion algorithm does OpenCV cvtColor() use?OpenCV cvtColor() 使用什么灰度转换算法?
【发布时间】:2013-10-11 10:59:15
【问题描述】:

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

【问题讨论】:

  • 为什么您的光度公式与 G 因子的参考值不同(0.71 对 0.72) - 这是拼写错误还是故意的?

标签: algorithm opencv grayscale


【解决方案1】:

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

Y = 0.299 R + 0.587 G + 0.114 B

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

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

【讨论】:

    【解决方案2】:

    只是想指出:

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

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2012-01-17
      相关资源
      最近更新 更多