【问题标题】:How to count bright pixels in an image?如何计算图像中的亮像素?
【发布时间】:2017-11-27 21:25:48
【问题描述】:

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

【问题讨论】:

    标签: python count sum


    【解决方案1】:

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

    使用 numpy

    您只需要将 img 从 PIL Image 转换为 numpy 数组,您可以使用 np.array(img) 来完成。然后为像素高于阈值np.array(img) >= 200 创建一个布尔掩码。这将创建一个与您的图像大小相同的数组,每个像素位置带有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())
    

    【讨论】:

      【解决方案2】:

      打印前只计算像素数:

      from PIL import Image
      img = input("File name: ")
      img = Image.open(img);
      count = 0
      for y in range(img.height):
        for x in range(img.width):
          pixel = img.getpixel((x, y))
          if pixel >= 200:
            count += 1
      
      print(count,"pixels are bright.")
      

      【讨论】:

        【解决方案3】:

        您可以使用 PIL 图像中的 getcolors() 函数,该函数返回一个元组列表,其中包含在图像中找到的颜色以及每个颜色的数量。我正在使用以下函数返回一个字典,其中颜色为键,计数器为值。

        from PIL import Image
        
        def getcolordict(im):
            w,h = im.size
            colors = im.getcolors(w*h)
            colordict = { x[1]:x[0] for x in colors }
            return colordict
        
        im = Image.open('image.jpg')
        colordict = getcolordict(im)
        
        # get the amount of black pixels in image
        # in RGB black is 0,0,0
        black_pixels_count = colordict.get((0,0,0))
        
        # get the amount of white pixels in image
        # in RGB white is 255,255,255
        white_pixels_count = colordict.get((255,255,255))  
        

        【讨论】:

          【解决方案4】:

          你也可以试试这个(Python 3):

          from PIL import Image
          
          imgFile = input("File name: ")
          img = Image.open(imgFile);
          pixels = img.getdata()
          total = len(list(filter(lambda i: i >= (200,200,200), pixels)))
          print("There are %d bright pixels" % total)
          

          您可以使用getdata() 方法一次性获取所有像素,然后您可以过滤高于所需值的像素。在 Python 2 中,您可以简单地编写 i >= 200

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-07
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 2021-02-23
            • 1970-01-01
            相关资源
            最近更新 更多