一、需求描述
1、摄像机在拍照的时候,会打开闪光灯进行拍照,假如闪光灯在拍照之后打开,就会产生黑图
2、因此,我们需要摄像机采集很多图片,检查是否每次拍照都是正常的
3、我们可以通过人眼进行查看,但是照片很多,难免有判断失误的时候
4、因此,我们设计一段python程序去识别黑图
二、设计思路
1、灰度值概念
由于景物各点的颜色及亮度不同,摄成的黑白照片上或电视接收机重现的黑白图像上各点呈现不同程度的灰色。把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途。
2、黑色的图片接近于0,因此我们可以设置一个范围来判断是否为黑图,如0到50会被认定为黑图
三、程序设计
1、使用python求一张图片的平均灰度值
(1)创建py文件,命名为:根据灰度值检查成像是否存在黑图情况.py
(2)在D盘创建存图片的目录“黑图”,路径为:D:\黑图
(3)本段代码使用Python的Pillow库,并定义了函数image_gray来计算一张图片的平均灰度值,具体步骤如下:
①使用Image.open()方法打开一张图片,参数为图片路径,返回一个Image对象。
②使用width和height属性获取图片的宽度和高度,用于遍历所有像素点。
③定义变量gray_sum和count,分别用于累计灰度值和像素点数。
④使用两个嵌套的循环遍历所有像素点,获取像素点的灰度值,并将灰度值累加到gray_sum中。
⑤在每次循环中将count加1,用于统计像素点总数。
⑥计算平均灰度值,即gray_sum除以count。
⑦打印结果,即图片的平均灰度值。
这段代码中使用了Pillow库中的Image
对象的getpixel()
方法来获取每个像素点的灰度值,由于灰度值可能是一个数值,也可能是一个元组(RGB模式下),因此需要进行判断并使用不同的方式获取灰度值。如下是代码:
from PIL import Image
def image_gray():
# 打开图片
img = Image.open(r'D:\黑图\20221206093515451.png')
# 计算平均灰度值
gray_sum = 0
count = 0
for x in range(img.width):
for y in range(img.height):
if img.mode == "RGB":
r, g, b = img.getpixel((x, y))
gray_sum += (r + g + b) / 3
elif img.mode == "L":
gray_value = img.getpixel((x, y))
gray_sum += gray_value
count += 1
avg_gray = gray_sum / count
print("平均灰度值为:", avg_gray)
if __name__ == "__main__":
image_gray()
2、使用python写一段程序遍历某个文件夹下所有文件
(1)因为图片不止一张,因此我们有必要遍历一整个文件夹的图片
import os
def find_image():
# 定义要遍历的文件夹路径
folder_path = r'D:\黑图'
# 遍历文件夹下的所有文件
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
# 处理每个文件
# 例如:打印文件路径
print(file_path)
上面的代码中,os.walk()
方法会遍历指定路径下的所有文件和子文件夹,返回一个三元组(root, dirs, files)
,其中root
表示当前遍历的文件夹路径,dirs
表示当前文件夹下的子文件夹列表,files
表示当前文件夹下的文件列表。然后我们可以使用os.path.join()
方法将当前文件的路径拼接出来,进而处理每个文件。
3、基于1、2的逻辑,我们来写一下判断黑图的逻辑
(1)修改1、2,让其更好被使用
(2)灰度值小于50被认为是黑图
import os
from PIL import Image
def image_gray(img):
# 打开图片
img = Image.open(img)
# 计算平均灰度值
gray_sum = 0
count = 0
for x in range(img.width):
for y in range(img.height):
if img.mode == "RGB":
r, g, b = img.getpixel((x, y))
gray_sum += (r + g + b) / 3
elif img.mode == "L":
gray_value = img.getpixel((x, y))
gray_sum += gray_value
count += 1
avg_gray = gray_sum / count
return avg_gray
def find_image(folder_path):
# 定义一个列表存储图片路径
images = []
# 遍历文件夹下的所有文件
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
# 处理每个文件,将其添加到列表中
images.append(file_path)
return images
def assert_run(folder_path):
images=find_image(folder_path)
for img in images:
gray = image_gray(img)
# 灰度值小于50,将认为是黑图
if gray < 50:
print(img, ":", gray)
if __name__ == "__main__":
# image_gray()
# find_image()
folder_path = r'D:\黑图'
assert_run(folder_path)
4、测试验证如下