python:根据灰度值检查成像是否存在黑图情况

一、需求描述

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、测试验证如下

 

红外热成像温度提取是利用红外热像仪采集到的热像数据,通过一定的算法将其转化为对应的温度信息。在Python中,可以使用一些开源库和函数来实现红外热成像温度提取。 首先,需要导入相应的库,例如OpenCV和Numpy: ``` import cv2 import numpy as np ``` 接下来,读取热像数据,可以使用OpenCV库中的`cv2.imread()`函数: ``` image = cv2.imread("thermal_image.jpg") ``` 红外热像数据通常是以灰度图像的形式存在的,可以将其转化为灰度图像: ``` gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 灰度图像中的亮度值与温度存在一定的关系,可以通过一些公式来将亮度值转化为对应的温度值。常见的转化公式包括线性公式和非线性公式,具体的选取取决于热像仪的型号和厂商。以下是一个示例的线性转化公式: ``` temperature = gray_image * 0.1 ``` 上述公式中的0.1是一个常数,用于将亮度值映射到温度范围。 最后,可以将提取到的温度信息进行可视化展示,可以使用Matplotlib库中的函数来实现: ``` import matplotlib.pyplot as plt plt.imshow(temperature, cmap='hot') plt.colorbar() plt.show() ``` 上述代码将温度信息以彩色图像的形式展示出来,并添加一个温度色标。 综上所述,以上介绍了如何使用Python实现红外热成像温度提取的基本步骤。除了上述方法外,还可以根据具体需求和数据格式,选择不同的库和函数来实现温度提取和可视化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值