这段代码使用 Python 的 OpenCV 和 NumPy 库,用于检测图像中的白屏。

首先,代码通过 cv2.mean(gray_img)[0] 计算灰度图像的平均像素值 mean。然后,将图像展平为一维数组 flat_img,并使用 np.bincount(flat_img) 统计每个像素值在数组中出现的次数。接着,通过 np.argmax(counts) 找到出现次数最多的像素值的索引 max_count_idx,并计算其出现次数的比例 max_count_ratio

接下来,代码根据 meanmax_count_ratio 的值判断图像是否为白屏。如果 mean 大于 100 或者 ( max_count_ratio 大于 0.98 且 mean 大于 250),则认为图像为白屏,并将该图像的文件名、meanmax_count_ratio 添加到 white_scr 列表中,并将当前时间和 mean 添加到 white_time_temp 列表中。

代码还会记录白屏的持续时间。如果 white_time_temp 列表的长度达到 3,则将该列表中第一个时间值的格式化字符串赋值给 record_time 变量,并判断 white_time_temp 列表中最后两个时间值是否不相等,并且最后两个时间值之间的时间差是否大于 2 秒。如果满足条件,则将 record_time 和最后两个时间值之间的时间差添加到 white_time 列表中,并将 white_time_temp 重置为空列表。否则,将 white_time_temp 重置为空列表。

这段代码可以通过设置不同的阈值来调整白屏检测的灵敏度。例如,可以通过调整 meanmax_count_ratio 的阈值来区分不同程度的白屏。

以下是对代码进行优化后的版本,使其更加清晰易懂,并提高了代码的效率。

import cv2
import numpy as np
import os
import datetime

def detect_white_screen(filename):
    img = cv2.imread(filename)
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    mean = cv2.mean(gray_img)[0]
    flat_img = np.ravel(img)
    counts = np.bincount(flat_img)
    max_count_idx = np.argmax(counts)
    max_count_ratio = float(counts[max_count_idx]) / len(flat_img)
    
    return mean, max_count_ratio

def record_white_screen(filename, mean, max_count_ratio, white_scr, white_time_temp, white_time):
    if mean > 100 or (max_count_ratio > 0.98 and mean > 250):
        white_scr.append((os.path.basename(filename), mean, max_count_ratio))
        white_time_temp.append((datetime.datetime.now(), mean))
        if len(white_time_temp) >= 3:
            record_time = datetime.datetime.strftime(white_time_temp[0][0], '%Y%m%d-%H%M%S.%f')[:-3]
            if white_time_temp[-1][0] != white_time_temp[-2][0] and (white_time_temp[-2][0] - white_time_temp[0][0]).total_seconds() > 2:
                white_time.append((record_time, (white_time_temp[-2][0] - white_time_temp[0][0]).total_seconds()))
            white_time_temp = []

# 初始化列表
white_scr = []
white_time_temp = []
white_time = []

# 处理图像
for filename in ['image1.jpg', 'image2.png', 'image3.bmp']:  # 替换为实际的图像文件路径
    mean, max_count_ratio = detect_white_screen(filename)
    record_white_screen(filename, mean, max_count_ratio, white_scr, white_time_temp, white_time)

# 打印结果
print(f'白屏图像列表: {white_scr}')
print(f'白屏持续时间列表: {white_time}')

优化后的代码将检测白屏的逻辑封装在两个函数中,提高了代码的可读性和可维护性。同时,将白屏检测和时间记录的逻辑分离,避免了代码冗余。

此外,代码还使用了 f-string 格式化字符串,使代码更加简洁。

这段代码能够帮助你检测图像中的白屏,并记录白屏出现的持续时间,可以应用于监控系统、图像质量评估等场景。

Python图像白屏检测代码解析与优化

原文地址: https://www.cveoy.top/t/topic/psfp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录