opencv-python实战项目二:图像模糊检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、简介:

在日常生活中,摄影已成为记录关键时刻的重要手段。不论是使用手机还是专业相机,拍摄工具都是我们保存回忆的辅助工具。然而,由于各种原因,如微风或手抖,拍摄的照片可能会出现模糊。为了高效地管理这些照片,图像模糊检测技术应运而生。

该技术能够自动识别图像的清晰度,迅速筛选出模糊照片,从而节省用户在照片筛选上投入的时间和精力。通过算法分析图像特征,如梯度、频率成分和边缘强度,图像模糊检测技术能够客观地评估图像质量。用户仅需简单的操作,即可实现对照片库的快速清理,确保保留的都是高质量、清晰的照片。这项技术的应用,极大提升了照片管理的效率。

二、模糊图片检测方案

本次项目,采用了一种结合Sobel算子和拉普拉斯算子的方案。Sobel算子通过计算图像灰度的空间梯度来突出边缘信息,有效地识别出图像中的边缘特征。而拉普拉斯算子作为一种二阶导数算子,能够检测图像中的平坦区域和边缘变化,从而突出图像的细节信息。将这两种算子相结合,可以发挥它们各自的优势,不仅能够精确地检测到图像的边缘,还能细致地捕捉到图像中的细节变化,从而显著提升图像模糊检测的整体性能。

三、算法实现步骤

1.读取图像

2.灰度转换

3.计算拉普拉斯方差

4.计算Sobel均值

5.模糊判定

四、代码实现

代码如下(示例):

python 复制代码
# 导入必要的库
import argparse
import cv2
import numpy as np
import os

# 定义一个函数,计算图像的拉普拉斯方差,用于评估图像的清晰度
def variance_of_laplacian(image):
    # 使用cv2.Laplacian计算图像的拉普拉斯变换,并返回变换后的方差
    return cv2.Laplacian(image, cv2.CV_64F).var()

# 定义一个函数,计算图像的Sobel梯度均值
def compute_sobel(image):
    # 将图像从BGR转换为灰度
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 计算水平和垂直方向的Sobel梯度
    sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=5)
    sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=5)
    # 计算梯度的合成幅度
    sobel = np.sqrt(sobelx ** 2 + sobely ** 2)
    # 打印梯度的均值
    print(np.mean(sobel))
    # 返回梯度的均值
    return np.mean(sobel)

# 定义一个函数,判断图像是否模糊
def is_blurry(image, threshold=100.0):
    # 将图像从BGR转换为灰度
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 计算拉普拉斯方差
    fm = variance_of_laplacian(gray)
    # 计算Sobel梯度均值
    sobel_mean = compute_sobel(image)
    # 计算模糊度量值,这里结合了拉普拉斯方差和Sobel均值255是参数,根据你场景的图片进行调整
    blur_measure = (0.5 * fm) + (0.5 * (sobel_mean-255))
    # 如果模糊度量值小于阈值,则返回True,表示图像模糊
    return blur_measure < threshold

# 定义一个函数,列出指定目录下的所有图像文件
def list_images(directory):
    image_files = []
    # 遍历目录中的所有文件
    for file in os.listdir(directory):
        # 如果文件是图像文件,则将其路径添加到列表中
        if file.endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):
            image_files.append(os.path.join(directory, file))
    # 返回图像文件路径列表
    return image_files

# 主函数
if __name__ == '__main__':
    # 创建命令行参数解析器
    ap = argparse.ArgumentParser()
    # 添加图像路径和模糊阈值的参数
    ap.add_argument("-i", "--images", help="设置输入图片的路径", default=r'F:\im')
    ap.add_argument("-t", "--threshold", type=float, default=20.0, help="设置模糊阈值")
    # 解析命令行参数
    args = vars(ap.parse_args())
    # 获取指定路径下的所有图像文件路径
    image_paths = list_images(args["images"])
    # 遍历所有图像文件
    for imagePath in image_paths:
        # 读取图像
        image = cv2.imread(imagePath)
        # 默认文本标签
        text = "Not Blurry"
        # 判断图像是否模糊
        if is_blurry(image, args["threshold"]):
            text = "Blurry"  # 如果模糊,则更改文本标签
        # 在图像上添加文本标签
        cv2.putText(image, "{}".format(text), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
        # 显示图像
        cv2.imshow("Image", image)
        # 等待按键操作
        key = cv2.waitKey(0)
        # 如果按下'q'键,则退出循环
        if key == ord('q'):
            break

    # 关闭所有OpenCV窗口
    cv2.destroyAllWindows()

五、算法效果



相关推荐
血小溅1 分钟前
什么是 Agent?
人工智能
szxinmai主板定制专家3 分钟前
面向虚拟电厂协调控制:RK3588+FPGA+AI边缘控制器设计思路与算力评估
人工智能·嵌入式硬件·fpga开发·机器人·jetson·zynq·振动采集
JingliAlex4 分钟前
微信自动回复突然全停了?五个检查点从外到内
人工智能
谢亮_vipxieliang5 分钟前
云原生存储进阶:CSI 演进与 AI 工作负载的存储架构设计
人工智能·云原生
Nil2087 分钟前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
ZZ2026011520 分钟前
维普露禾平台免费开放,聊聊教育垂直大模型的RAG实现思路
大数据·人工智能·系统架构·知识图谱
小猴子爱上树20 分钟前
跨境电商AI图片翻译工具:批量图片翻译、视频字幕翻译与智能抠图一站式解决
大数据·人工智能·python·音视频
七十二时95626 分钟前
2026 企业级 AI 办公平台选型指南:如何判断哪些 AI 满足企业办公需求
大数据·人工智能
小羊没烦恼!27 分钟前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路30 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程