Python图像处理之模糊图像判断

青禾
青禾
发布时间:2026-10-16| 4人浏览过
原创

本文介绍基于Python和OpenCV的动态模糊图像判定方法。针对梯度求解在不同场景下的局限性,采用Laplace算子计算图像梯度方差,通过标准图像与测试图像建立模糊判定区间(a, b)。当图像梯度值小于a或介于a与b之间时判定为模糊,大于b则为清晰。该方法适用于固定分辨率的工业场景,如道路裂缝检测。

上期回顾

此前的图像清晰度评估未能成功,主要原因是各类清晰度评价函数均依赖梯度求解。由于不同场景下灰度明暗差异较大,导致梯度值波动剧烈,难以确定一个统一的界定值来准确判定图像清晰度。因此,本次研究聚焦于动态模糊图像的识别,旨在判断图像是否属于动态模糊类型。

图像处理:图像清晰度评价

采用Laplace算子的原因

基于前期调研,在多种清晰度评价函数中,最终选定Laplace算子。原因在于该算子计算出的梯度值相对较小,更容易确定模糊判断的区间;而其他方法获得的梯度值较大,相应的误差范围也更高。此外,OpenCV已集成Laplace算子,调用便捷且能取得良好效果。

实现的效果

本次实验将使用一组模糊图像和一组标准图像,以获取模糊判定区间(a,b)。原理是梯度值越大,图像越清晰。因此,当测试图像的返回梯度值小于a时,可判定为模糊图像;当梯度值大于b时,判定为清晰图像;若梯度值落在a与b之间,同样将其归类为模糊图像。

图片素材

测试素材采用手机拍摄的照片,分辨率统一为1280*960。需注意,图像尺寸与场景会影响返回的梯度值。但由于通常采集的数据由相机拍摄且尺寸相同,工业场景中道路裂缝检测的场景也基本类似,因此该研究具有实际应用意义。

代码的展示与讲解

import cv2
import os
 
def getPhotopath(paths):
    imgfile = []
    file_list=os.listdir(paths)
    for i in file_list:
        newph=os.path.join(paths,i)
        imgfile.append(newph)
    return imgfile
 
def getImgVar(image):
    imggray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    imageVar = cv2.Laplacian(imggray, cv2.CV_64F).var()
    return imageVar
 
def getTest(imgfile):
    c = []
    for i in imgfile:
        # print(i)
        img=cv2.imread(i)
        image=getImgVar(img)
        # print(image)
        c.append(float(f"{image:.3f}"))
    if 'test' in imgfile[0]:   #对测试集数据进行反转
        c.sort(reverse=True)
    else:
        c.sort()
    return c
 
def getThr():
    a=getTest(imgfile1)
    b=getTest(imgfile2)
    thr=(a[0],b[0])
    # print(thr)
    return thr
 
path1="./test"     #测试的数据集文件夹位置
path2="./Standards"  #标准图的数据文件夹位置
#获取文件下的名称
imgfile1=getPhotopath(path1)
imgfile2=getPhotopath(path2)
 
#获得阈值
minThr,maxThr=getThr()
print(minThr,maxThr)
 
def vagueJudge(image):
    img = cv2.imread(image)
    imgVar = getImgVar(img)
    if imgVar>maxThr:
        cv2.putText(img, f"Not Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 0), 3)
    else:
        cv2.putText(img, f"Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 0), 3)
    cv2.imshow("img",img)
    k=cv2.waitKey(0) & 0xFF
image="./Standards/001.jpg"   #需要进行测试的图片
vagueJudge(image)
getPhotopath函数:获得文件夹下各个图片路径,输入模糊图片的文件夹,输入标准图像的文件夹,存入列表当中。
getImgVar函数:返回图像梯度值。
getTest函数:对每个图像进行了梯度值计算后,存入列表当中,对模糊图像的进行列表序列翻转。
def getThr函数:获得模糊判定区间(a,b)。
vagueJudge函数:对新输入的图像进行模糊判定,只要小于b,就判定为模糊。

效果展示

为避免重新拍摄图片,本次测试直接采用./test文件夹和./Standards文件夹中的现有图片。

控制台打印的模糊判定区间为:

4.327 65.401

image="./Standards/001.jpg"

image="./test/01.jpg"

项目资源

GitHub链接

到此这篇关于Python图像处理之模糊图像判断的文章就介绍到这了,更多相关Python模糊图像判断内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。