繁体   English   中英

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

[英]Python PIL Detect if an image is completely black or white

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

〜〜更新

条件: 迭代每个像素!

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

扩展到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

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

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

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

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

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

我尝试了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 Image对象。 如果图像是黑色或白色,你也可以通过小的修改检查..但是你必须决定“白色”是0还是255,也许你有明确的答案,我没有。 :-)希望有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM