Python+Opencv检测模糊图片

15 篇文章 7 订阅

一、场景需求解读

  现实场景中,我们经常会使用不同的设备区拍摄一些照片,常用的一些设备包括手机、相机等,但是在拍摄的过程中可能会受到一些因素的影响,最终导致拍摄出来的照片比较模糊。对于这些图片而言,我们经常利用人眼进行观察,这样比较费时费力,本文针对这个问题提出了一种全自动的方法来检测模糊的图片,这样可以极大的节约用户的时间。下图展示了一个案例,其中包含几张模糊的图片和清晰的图片。
在这里插入图片描述

二、模糊图片检测方案简介

方案一

  • 首先对输入的图片进行快速傅里叶变换操作;
  • 然后检测图片中高频分量和低频分量的分布情况;
  • 接着根据图片中包含的高频分量的多少进行合适的判断,如果图片中含有较少的高频分量,则表明该图片是模糊图片,否则是清晰图片。

方案二: 根据该文章的思路来进行检测。即根据Laplacian变换的方差值进行判断。

通过对比这两个方案,我们可以发现方案二更快、更方便。

三、模糊图片检测原理简介

  整个算法的原理和拉普拉斯算子本身的定义有关,该算子主要用来测量图像的二阶导数。它强调了包含快速强度变化的图像区域。拉普拉斯算子经常被用来做边缘检测。这里存在着一个假设,即如果一个图像中包含着高方差,那么在图像中会有较大范围的响应,包括边缘和非边缘,这代表着一张正常图像。但是如果该图像的方差很低,那么响应的范围很小,这表明图像中的边缘很小。众所周知的是当图像越模糊时,包含的边缘信息就会越少。

四、算法实现步骤

步骤1-读取输入图片;
步骤2-输入图片灰度化;
步骤3-与特定的Laplacian核进行卷积;
步骤4-计算响应的方差值;
步骤5-如果当前的方差值<threshold,则该图片为模糊图片,否则不是模糊图片。

五、算法代码实现

# coding=utf-8
# 导入相应的python包
from imutils import paths
import argparse
import cv2

def variance_of_laplacian(image):
	'''
    计算图像的laplacian响应的方差值
    '''
	return cv2.Laplacian(image, cv2.CV_64F).var()

if __name__ == '__main__':
    # 设置参数
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--images", required=True, help="设置输入图片的路径")
    ap.add_argument("-t", "--threshold", type=float, default=100.0, help="设置模糊阈值")
    args = vars(ap.parse_args())

    # 遍历每一张图片
    for imagePath in paths.list_images(args["images"]):
        # 读取图片
        image = cv2.imread(imagePath)
        # 将图片转换为灰度图片
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 计算灰度图片的方差
        fm = variance_of_laplacian(gray)
        text = "Not Blurry"

        # 设置输出的文字
        if fm < args["threshold"]:
            text = "Blurry"

        # 显示结果
        cv2.putText(image, "{}: {:.2f}".format(text, fm), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
        cv2.imshow("Image", image)
        key = cv2.waitKey(0)

运行方法:python detece_blur_imgae.py -i 图片路径 (这里的图片路径需要修改成你自己的路径)

六、算法效果展示与分析

在这里插入图片描述
  上图展示了该算法的检测结果,通过观察上图我们可以获得一些信息,即该算法能够准确的检测出模糊图片,并在图片的左上角区域内输出结果并展示相应的方差值。尽管该算法的思路和实现都比较简单,但是它简单高效。

参考资料

[1] 参考链接

注意事项

[1] 如果您对AI、自动驾驶、AR、ChatGPT等技术感兴趣,欢迎关注我的微信公众号“AI产品汇”,有问题可以在公众号中私聊我!
[2] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[3] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[4] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[5] 本文测试的图片可以通过关注公众号AI产品汇之后找我索取!
[6] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!

  • 17
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我了解了你的问题。关于利用 Python + OpenCV 识别图片中的圆形(霍夫变换),我可以给你一些详细的解释和代码示例。 首先,我们需要导入 OpenCV 库和 NumPy 库。这里需要注意的是,需要安装正确的 OpenCV 版本,否则可能会出现一些问题。 ```python import cv2 import numpy as np ``` 接下来,我们需要读取图片并将其转换为灰度图像。然后,我们可以对灰度图像进行高斯模糊处理,以减少噪声。这里的高斯核大小可以根据实际情况进行调整。 ```python img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) ``` 接着,我们可以使用霍夫变换检测圆形。这里需要注意的是,需要设置最小半径和最大半径的范围,以及检测圆形的参数阈值。这些参数的设置也需要根据实际情况进行调整。 ```python circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=0, maxRadius=0) ``` 最后,我们可以将检测到的圆形标记出来,并显示图片。 ```python if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(img, (x, y), r, (0, 255, 0), 2) cv2.imshow("Image", img) cv2.waitKey(0) ``` 完整代码如下: ```python import cv2 import numpy as np img = cv2.imread('image.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=0, maxRadius=0) if circles is not None: circles = np.round(circles[0, :]).astype("int") for (x, y, r) in circles: cv2.circle(img, (x, y), r, (0, 255, 0), 2) cv2.imshow("Image", img) cv2.waitKey(0) ``` 希望这个代码示例能对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值