首页 > 解决方案 > 如何删除包含超过 90% 黑色像素的图像?

问题描述

我已将图像拆分为多个补丁(块):

将图像拆分为 16 个补丁的示例

但是,我现在想删除包含 90% 以上黑色像素的黑色补丁。目前,我编写了这段代码,但它不起作用,因为它增加了黑色像素的值:

import os 
import glob 
from PIL import Image

def count(path): 
    black = nonblack = 0
    for filename in glob.glob(path):
        img = Image.open(filename)
        width = img.width
        height = img.height
        total = width * height
        lower = 90
        higher = 100

        for pixel in img.getdata():
            if pixel == (0, 0, 0):
                black += 1
                percent = round((black * 100.0/total),1)
                if((percent >= lower) & (percent < higher)):
                    print('yes remove')
                    os.remove(filename)
                    break
            else:
                nonblack += 1
                print("black = ", black, " nonblack = ", nonblack)

path = 'C:\\Mypath\\*.jpg'
count(path)

标签: pythonimagepython-imaging-library

解决方案


您应该在计算完所有像素后进行百分比检查

import os 
import glob 
from PIL import Image

    def count(path): 
        black = nonblack = 0
        for filename in glob.glob(path):
            img = Image.open(filename)
            width = img.width
            height = img.height
            total = width * height
            lower = 90
            higher = 100
    
            for pixel in img.getdata():
                if pixel == (0, 0, 0):
                    black += 1
                else:
                    nonblack += 1
                    print("black = ", black, " nonblack = ", nonblack)
            
            percent = round((black * 100.0/total),1)
            if((percent >= lower) & (percent < higher)):
                print('yes remove')
                os.remove(filename)
                break

    path = 'C:\\Mypath\\*.jpg'
    count(path)

但是,我觉得您的方法存在问题,因为您仅将 (0,0,0) 的像素计算为黑色像素。RGB 值的微小变化仍会显示为黑色,但不会被计算在内。例如 (0,0,1), (1,3,4) 等......都显示为黑色,但不会被您的代码计算在内。


推荐阅读