Python PIL检测图像是完全黑色还是白色

时间:2012-12-26 13:52:54

标签: python python-imaging-library

使用Python Imaging Library PIL如何检测图像的所有像素是黑色还是白色?

〜更新〜

条件:遍历每个像素!

4 个答案:

答案 0 :(得分:23)

if not img.getbbox():

...将测试图像是否完全是黑色。 (Image.getbbox()如果图像中没有非黑色像素,则返回虚假None,否则返回一个点的元组,这是真实的。)要测试图像是否完全是白色,请将其反转第一:

if not ImageChops.invert(img).getbbox():

您也可以使用img.getextrema()。这将告诉您图像中的最高和最低值。为了最容易地解决这个问题,您应该首先将图像转换为灰度模式(否则极值可能是RGB或RGBA元组,单个灰度值,索引,你必须处理所有这些)。

extrema = img.convert("L").getextrema()
if extrema == (0, 0):
    # all black
elif extrema == (1, 1):
    # all white

后一种方法可能会更快,但在大多数应用程序中都不会这么快(两者都会非常快)。

上述技术的单行版本,可测试黑色或白色:

if sum(img.convert("L").getextrema()) in (0, 2):
    # either all black or all white

答案 1 :(得分:8)

扩展到Kindall: 如果你看一个名为img的图像:

extrema = img.convert("L").getextrema()

它为您提供了图像中的一系列值。因此全黑图像将是(0,0)并且全白图像是(255,255)。所以你可以看看:

if extrema[0] == extrema[1]:
    return("This image is one solid color, so I won't use it")
else:
    # do something with the image img
    pass

当我从某些数据创建缩略图并希望确保它正确读取时,对我很有用。

答案 2 :(得分:5)

from PIL import Image
img = Image.open("test.png")
clrs = img.getcolors()

clrs包含[("num of occurences","color"),...]

通过检查len(clrs) == 1,您可以验证图片是否只包含一种颜色,并通过查看clrs中第一个元组的第二个元素,您可以推断出颜色。

如果图像包含多种颜色,那么通过考虑出现的次数,如果99%的像素共享相同的颜色,您还可以处理几乎完全单色的图像。

答案 3 :(得分:1)

我尝试了Kindall解决方案ImageChops.invert(img).getbbox(),但没有成功,我的测试图像失败了。

我注意到一个问题,白色应该为255 但是。我发现数字极值为(0,0)的白色图像。为什么?请参阅下面的更新。

我已经更改了Kindall第二种解决方案(getextrema),该解决方案可以正常工作,并且不需要图像转换,我编写了一个函数并验证了它可以同时用于灰度和RGB图像:

def is_monochromatic_image(img):
    extr = img.getextrema()
    a = 0
    for i in extr:
        if isinstance(i, tuple):
            a += abs(i[0] - i[1])
        else:
            a = abs(extr[0] - extr[1])
            break
    return a == 0

img参数是一个PIL图像对象。 您还可以进行少量修改来检查图像是黑色还是白色。但是您必须确定“白色”是0还是255,也许您有明确的答案,但我没有。 :-) 希望有用

更新:我认为内部带有零的白色图像可能是PNG或其他具有透明度的图像格式。