【问题标题】:How to check if an RGB image contains only one color?如何检查 RGB 图像是否只包含一种颜色?
【发布时间】:2010-10-15 05:05:22
【问题描述】:

我正在使用 Python 和 PIL。

我有 RGB 格式的图像,我想知道那些只包含一种颜色(例如 #FF0000)或几种非常接近的颜色(#FF0000 和 #FF0001)的图像。

我在考虑使用直方图,但很难用 3 个色带找出一些东西,所以我正在寻找更聪明的算法。

有什么想法吗?

ImageStat 模块就是答案!谢谢亚伦。 我使用 ImageStat.var 来获取方差,并且效果很好。

这是我的一段代码:

from PIL import Image, ImageStat

MONOCHROMATIC_MAX_VARIANCE = 0.005

def is_monochromatic_image(src):
    v = ImageStat.Stat(Image.open(src)).var
    return reduce(lambda x, y: x and y < MONOCHROMATIC_MAX_VARIANCE, v, True)

【问题讨论】:

    标签: python image colors python-imaging-library


    【解决方案1】:

    试试ImageStat module。如果extrema返回的值相同,则图像中只有一种颜色。

    【讨论】:

      【解决方案2】:

      首先,您应该定义两种颜色之间的距离。 然后,您只需验证每个像素与您的颜色的距离是否足够小。

      【讨论】:

      • 计算 3 维 RGB 空间中每个像素之间的欧几里得距离理论上是可以的,但我认为它不适用于数百万像素的图像......(至少在 Python 中)
      • 为什么是欧几里得距离?您可以根据自己的需要想象其他东西。
      • 问题不在于距离的类型,而在于算法是 O(N^2),N 是图像中的像素数(我有 N=10,000,000 的情况)
      • 也许我误解了你的问题。如果你必须检查每个像素是否足够接近给定的颜色,那就是线性时间。
      • @Smuk:我不认为这是给定的颜色——它们最接近的颜色可能是任何东西,特定于每张图像,对吧?
      【解决方案3】:

      这里有一个小sn-p,你可以使用:

      
      import Image
      
      im = Image.open("path_to_image")
      width,height = im.size
      
      for w in range(0,width):
        for h in range(0,height):
           # this will hold the value of all the channels
           color_tuple = im.getpixel((w,h))
           # do something with the colors here
      

      也许使用散列并将元组存储为键,并将其出现次数存储为值?

      【讨论】:

        猜你喜欢
        • 2016-06-18
        • 2013-01-26
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多