python - 如何计算图像中的亮像素?

如何使此代码打印超过 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.      

最佳答案

你根本不需要循环。只需创建一个掩码,返回哪些像素高于阈值,然后对掩码求和。

使用 numpy

您只需将 img 从 PIL Image 转换为 numpy 数组,您可以使用 np.array(img)。然后为像素高于阈值 np.array(img) >= 200 创建一个 bool 掩码。这将创建一个与您的图像大小相同的数组,每个像素位置的 TrueFalse 是否符合条件。然后,如果您 np.sum() 结果图像,它会将 True 转换为 1,将 False 转换为 0,因此求和将得出总和符合条件的像素数。所有这些都在一行中:

bright_count = np.sum(np.array(img) >= 200)

纯 PIL

对于不使用 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/

相关文章:

reactjs - 文件上传不适用于按钮单击 Material -UI V1 ReactJs

listview - Xamarin.Forms:软键盘与页面底部的最后一个条目(滚动时)重叠

bash - 在 bash 中有条件地将命令的输出定向到/dev/null

php - php swagger注释jsonproperty中方括号的转义字符

loops - 循环 Fortran 中的字符

html - 在 HTML 页面上组合 SVG 标签

batch-file - 在没有出现超时消息的情况下在批处理文件中运行超时命令

php - Laravel paginate 无法在 querybuilder 上选择某些列

java - 没有数据时应该返回哪个http代码

amazon-web-services - AWS GLUE 数据导入问题