使用 Python Imaging Library PIL 如何检测图像的像素是黑色还是白色?
~更新~
条件:不遍历每个像素!
if not img.getbbox():
...将测试以查看图像是否完全黑色。(如果图像中没有非黑色像素,则返回Image.getbbox()
falsy 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或其他具有透明度的图像格式。