【问题标题】:Check if a pixel (RGB or HSV) is contained in a color scale range, how检查像素(RGB 或 HSV)是否包含在色标范围内,如何
【发布时间】:2011-03-01 19:24:39
【问题描述】:

我需要检查一个像素 (RGB) 是否包含在从非常浅的粉红色到深紫色的色阶中。 使用 RGB 方案我可以做这样的检查:

IF image [x, y] [R]> threshold and image [x, y] [G]> threshold image [x, y] [B]> threshold and \
     image [x, y] [R] <threshold and image [x, y] [G] < threshold image [x, y] [B] <threshold THAN ...

?

如果没有,我还可以选择将像素放入 HSV。

谢谢!

【问题讨论】:

    标签: python image-processing rgb hsv


    【解决方案1】:

    您可能希望在 HSV 中工作,因为它比 RGB 更直观地映射到人类感知。如果您让人类将颜色标记为“范围内”或“范围外”,并将它们映射到 HSV 中,您将能够找到指示进出的 H、S 和 V 值的界限。

    然后,您可以使用前面概述的简单范围检查来确定颜色是进还是出。如果您在颜色空间转换方面需要 Python 帮助,标准库模块 colorsys 将为您完成。

    【讨论】:

      【解决方案2】:

      使用每个通道的截止值相当于在 RGB 颜色空间中指定一个轴对齐的矩形框。盒子是一种令人讨厌的形状 - 您可能必须包含一些您并不真正想要的区域(在角落)以避免排除您确实想要的区域(在面的中心)。

      如果您改为选择两个锚点和一个截止距离,则它相当于一个任意对齐的 3d 椭球 - 希望它应该更准确地匹配您想要的颜色。

      类似

      def colorRange(ax, ay, az, bx, by, bz, dist):
          def testPixel(cx, cy, cz):
              return (
                  (cx-ax)**2 + (cy-ay)**2 + (cz-az)**2
                  + (cx-bx)**2 + (cy-by)**2 + (cz-bz)**2
              ) < dist**2
          return testPixel
      
      isPurple = colorRange(140,0,140, 255,75,255, 230)
      isPurple(203,46,195)  # -> True
      

      【讨论】:

        【解决方案3】:

        如果您在谈论整数 RGB 值,您可以将所有值放入 set,然后只需执行 if color in set:

        如果您的“颜色范围”以复杂的方式定义,那么定义一组具体的颜色可能是唯一的方法。

        【讨论】:

        • 这将是一个大集合! :)
        • 这完全取决于如何定义“颜色范围”。 “从浅粉色到深紫色”不足以准确猜测。
        • 如果您假设它是 24 位彩色立方体体积的 5%,那么您将看到大约 850,000 个离散值。
        猜你喜欢
        • 1970-01-01
        • 2018-11-22
        • 2010-10-15
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2019-03-22
        相关资源
        最近更新 更多