[英]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.