如何使此代码打印超过 200 的亮像素总数:
from PIL import Image
img = input("File name: ")
img = Image.open(img);
for y in range(img.height):
for x in range(img.width):
pixel = img.getpixel((x, y))
if pixel >= 200:
print(pixel,"pixels are bright.")
现在它正在新行上打印 每个 超过 200 的单个像素,但我只想要一行打印总数,如下所示:
File name: slippers.png
121081 pixels are bright.
最佳答案
你根本不需要循环。只需创建一个掩码,返回哪些像素高于阈值,然后对掩码求和。
您只需将 img
从 PIL Image
转换为 numpy 数组,您可以使用 np.array(img)
。然后为像素高于阈值 np.array(img) >= 200
创建一个 bool 掩码。这将创建一个与您的图像大小相同的数组,每个像素位置的 True
或 False
是否符合条件。然后,如果您 np.sum()
结果图像,它会将 True
转换为 1,将 False
转换为 0,因此求和将得出总和符合条件的像素数。所有这些都在一行中:
bright_count = np.sum(np.array(img) >= 200)
对于不使用 numpy 的纯 PIL 解决方案,您可以使用 Image
类的 point()
方法。参见 this question/answer对方法进行很好的讨论。 point()
方法接受一个为像素分配新值的函数。在这里,只要它高于阈值,我就分配了一个值 1。然后,我使用 getdata()
方法从 Image
类型中获取数据,并使用 Python sum()
对数据求和功能。
bright_count = sum(img.point(lambda pix: 1 if pix>=thresh else 0).getdata())
https://stackoverflow.com/questions/47520048/