python+opencv图片模糊/过爆/过暗检测一条龙

目前bd到的基本都是c++版本,自己改了一个python的,阈值可以自己微调一下,有问题欢迎指出。
说明有空再写()
check.py主文件

from PIL import Image
import os
from os import listdir
from tools import calLaplacianVar,overExposeDetect

def check_image(img_path, fixedSize, stdTimes = 1):
    #正常值区间
    # distArea = []
    # distArea.append(calAvg(img) - calStd(img)*stdTimes)
    # distArea.append(calAvg(img) + calStd(img)*stdTimes)
    status = "normal"
    #当图片指标不在正常范围内,被判断为异常
    value = calLaplacianVar(img_path, fixedSize)
    if (value < 2200):
        isOutlier = True
        status = "vague"
        print(str(img_path) + "该图指标值:" + str(value) + " status:" + status)
        print(" 正常区间:[2200 , +)")
        return isOutlier
    else:
        isOutlier = False
    # print("该图指标值:" + str(value) + " status:" + status)
    isOutlier = overExposeDetect(img_path, fixedSize)
    return isOutlier

def main():
    test_folder = r'E:\newproject\test'
    #generate_folder = r'E:\newproject\generate'
    files = listdir(test_folder)
    for f in files:
        # print("图片" + f +":")
        check_image(os.path.join(test_folder, f), (448, 448))
if __name__ == '__main__':
    main()

工具文件tools.py

import cv2
import os
import numpy as np
import math

'''
@illustrate:用拉普拉斯计算图片模糊程度
@param img 图片路径, size(tuple)resize大小
@return 模糊程度
'''
def calLaplacianVar(img, size):
    grayImg = cv2.imread(img, 0)
    grayImg = cv2.resize(grayImg, size)
    sobelImg = cv2.Laplacian(grayImg, cv2.CV_64FC1)
    #标准差
    mu, sigma = cv2.meanStdDev(sobelImg) 
    sigmaValue = sigma[0][0]
    #方差
    variance = pow(sigmaValue, 2)
    return variance

"""
@illustrate: 曝光检测
@param
"""
def overExposeDetect(img_path,size):
    img = cv2.imread(img_path, 1)
    img = cv2.resize(img, size)
    thre = 0.175
    status = "normal"
    flag = False
    if img.shape[2] != 1:
        hsvSpaceImage = cv2.cvtColor(img, cv2.COLOR_RGB2HSV) # hsv转换
    else:
        hsvSpaceImage = img.clone()
    hsvImageVChannels = hsvSpaceImage[:, :, 2]
    step = 8   #以8*8小窗口遍历V通道图像
    imageOverExposeBlockNum = 0
    imageBlocks = 0
    imageDarkBlockNum = 0
    #遍历
    i = 0
    while i < hsvImageVChannels.shape[0]:
        j = 0
        while j < hsvImageVChannels.shape[1]:
            imageBlock = hsvImageVChannels[i:i+step, j:j+step]
            mea = np.mean(imageBlock)# 求小矩形的均值
            if mea > 233.0:
                imageOverExposeBlockNum += 1
            elif mea < 53.0:
                imageDarkBlockNum += 1
            imageBlocks += 1
            j += step
        i += step
    if imageDarkBlockNum/imageBlocks > thre:
        status = "dark"
        flag = True
    if imageOverExposeBlockNum/imageBlocks > thre:
        status = "overexposure"
        flag = True
    if flag == True:
        print(str(img_path) + "该图曝光度:" + str(imageOverExposeBlockNum/imageBlocks * 100) + " status:" + status)
        print(" 正常区间:(0," + str(thre*100) + "]")
    return flag
  • 10
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种高级编程语言,具有许多优点,其中一个亮点就是它的灵活性和易用性。使用Python,我们可以很轻松地实现各种功能,例如使用PythonOpenCV库来检测图像中的灯光亮点。 OpenCV是一个开源的计算机视觉库,它提供了许多图像处理和计算机视觉相关的功能。使用OpenCV,我们可以轻松地读取、处理和分析图像。 对于检测图像中的灯光亮点,我们可以使用一些图像处理技术来实现。首先,我们可以使用OpenCV的函数来读取图像并将其转换为灰度图像。然后,我们可以使用阈值函数来将图像二值化,将亮度高于某个阈值的像素设为白色,低于阈值的像素设为黑色。 接下来,我们可以使用连通组件分析技术来标记并提取图像中的亮点。连通组件分析将对图像进行像素级别的分析,将相连的亮像素组成一个连通组件。通过计算连通组件的大小和位置,我们可以筛选出符合条件的亮点。 最后,我们可以通过绘制圆圈或者方框来标记检测到的亮点,并将它们显示在原始图像上。这样,我们就可以直观地看到哪些区域含有灯光亮点。 总结来说,Python的一个亮点就是它丰富的库和工具,使得实现图像处理任务变得非常简单。使用PythonOpenCV,我们可以轻松地检测图像中的灯光亮点,并对它们进行分析和标记。这个功能对于许多领域,如计算机视觉、智能交通系统和图像识别等都非常有用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值