首页 > 其他分享 >使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

时间:2023-07-29 20:06:27浏览次数:44  
标签:gray 方差 拉普拉斯 image 模糊 cv2 Laplacian OpenCV 图像


写在前面


  • 工作中遇到,简单整理
  • 人脸识别中,对于模糊程度较高的图像数据,识别率低,错误率高。
  • 虽然使用 AdaFace 模型,对低质量人脸表现尤为突出。
  • 但是还是需要对 模糊程度高的图像进行丢弃处理
  • 当前通过阈值分类,符合要求的进行特性提取
  • 实际应用中,可以维护一个质量分数
  • 比如由 模糊程度图片字节大小人脸姿态评估(欧拉角)等 算出一个综合质量分,用于人脸归类/聚类
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


模糊度检测算法来自 :https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/

具体实现方式小伙伴可直接看原文

这种方法起作用的原因是由于拉普拉斯算子本身的定义,它用于测量图像的二阶导数。拉普拉斯突出显示包含快速强度变化的图像区域,与 Sobel 和 Scharr 算子非常相似。而且,就像这些运算符一样,拉普拉斯通常用于边缘检测。这里的假设是,如果图像包含高方差,则存在广泛的响应,包括边缘类和非边缘类,代表正常的焦点图像。但是,如果方差非常低,则响应的分布很小,表明图像中的边缘非常小。众所周知,图像越模糊,边缘就越少

下面为原文的 Demo

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@File    :   detect_blur.py
@Time    :   2023/07/24 22:57:51
@Author  :   Li Ruilong
@Version :   1.0
@Contact :   [email protected]
@Desc    :   图片模糊度检测
"""


# here put the import lib

# import the necessary packages
from imutils import paths
import cv2
import os

def variance_of_laplacian(image):
	gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
	# compute the Laplacian of the image and then return the focus
	# measure, which is simply the variance of the Laplacian
	return cv2.Laplacian(gray, cv2.CV_64F).var()


# loop over the input images
for imagePath in paths.list_images("./res/mh"):
	# load the image, convert it to grayscale, and compute the
	# focus measure of the image using the Variance of Laplacian
	# method
	image = cv2.imread(imagePath)
	fm = variance_of_laplacian(image)
	text = "Not Blurry"
	print(fm)
	# if the focus measure is less than the supplied threshold,
	# then the image should be considered "blurry"
	if fm < 100:
		text = "Blurry"
	# show the image
	file_name = os.path.basename(imagePath)
	cv2.imwrite(str(fm)+'__' + file_name , image)

核心代码:

cv2.Laplacian(gray, cv2.CV_64F).var()

如果为 Image.image ,可以使用下的方式

def variance_of_laplacian(image):
    """
    @Time    :   2023/07/25 01:57:44
    @Author  :   [email protected]
    @Version :   1.0
    @Desc    :   模糊度检测
                 Args:
                   
                 Returns:
                   void
    """
    numpy_image = np.array(image)
    cv2_image = cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR)
    gray = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2GRAY)
	# compute the Laplacian of the image and then return the focus
	# measure, which is simply the variance of the Laplacian
    return cv2.Laplacian(gray, cv2.CV_64F).var()

实际测试中发现,阈值设置为 100 相对来说比较合适,当然如何数据集很大,可以考虑 提高阈值,当模糊度大于 1000 时,一般为较清晰图片,低于 100 时,图片模糊严重

下面为对一组较模糊数据进行检测

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)_ci

最后一个图像,模糊度为 667 ,其他为 200 以内

(AdaFace) C:\Users\liruilong\Documents\GitHub\AdaFace_demo>python detect_blur.py
130.99918569797578
97.54477372302556
70.30346984100659
95.56028915335366
77.70006004883219
107.2065965492792
93.43007114319839
75.44132565995248
127.50238903320515
98.11810838476116
69.49917570127641
132.46578324273048
99.2095025510204
92.97255942246558
93.33812691062155
667.4883318795927


标签:gray,方差,拉普拉斯,image,模糊,cv2,Laplacian,OpenCV,图像
From: https://blog.51cto.com/liruilong/6895006

相关文章

  • 医学案例|两因素重复测量方差
    一、案例介绍将手术要求基本相同的15名患者随机分3组,在手术过程中分别采用A、B、C三种麻醉诱导方法,在T0(诱导前)、T1、T2、T3、T4五个时刻测量患者的收缩压,试着进行方差分析。二、问题分析可以从案例得到,数据既包含组别、测量时间以及组别和测量时间的交叉,所以考虑使用重复测量方......
  • OpenCV4之特征提取与对象检测
    1、图像特征概述图像特征的定义与表示图像特征表示是该图像唯一的表述,是图像的DNA图像特征提取概述传统图像特征提取-主要基于纹理、角点、颜色分布、梯度、边缘等深度卷积神经网络特征提取-基于监督学习、自动提取特征特征数据/特征属性尺度空间不变性像素迁移不......
  • 在windows平台使用Visual Studio 2017配置opencv开发环境
    opencv介绍OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方......
  • qt+opencv安装时的问题
    1、qt安装时可能无法启动,原因是缺少依赖项,执行以下指令:sudo apt-get install libxcb-xinerama0 2、qt运行时报错:GL/gl.h: No such file or directory。执行以下指令:sudo apt install mesa-common-devsudo apt install libgl1-mesa-dev 3、OpenCV编译时在执......
  • 如何使用OpenCV库进行图像检测
    importcv2#加载Haar级联分类器face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')#读取输入图像img=cv2.imread('input_image.jpg')gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#使用Haar级联分类器进行人脸检测fa......
  • 基于opencv和ffmpeg的视频处理
    importcv2importsubprocessinput_video_path="/home/navy/Desktop/1.mp4"opencv_video_path="/home/navy/Desktop/2.mp4"new_video_path="/home/navy/Desktop/3.mp4"#打开视频文件video=cv2.VideoCapture(input_video_path)#获取视......
  • OpenCV实现ResNet18推理
    前一篇实现了ResNet18训练自定义数据集,详细介绍了数据集制作、模型构建及训练,并且介绍了相应模块如何可视化。前面训练阶段是在python环境下进行的,但实际工程部署的时候大都采用C++实现推理,这一篇我们借助OpenCV实现ResNet18推理。一、准备1、OpenCV编译及安装借助OpenCV实现Re......
  • Vscode 编写opencv配置文件
    创建一个新文件夹并在vscode打开,在此文件夹下新建一个.vscode文件夹,再继续新建三个.json文件(tasks.json,launch.json,c_cpp_properties.json)。 c_cpp_properties.json如下,"includePath"添加自己的头文件路径,"compilerPath"改为自己对应的gcc路径。{"configurations":[......
  • Android opencv Mat 创建单位矩阵
    AndroidOpenCVMat创建单位矩阵在计算机视觉和图像处理中,矩阵是一个非常重要的概念。矩阵可以表示图像的像素值、进行图像变换、计算特征向量和特征值等。Android平台上,OpenCV是一个强大的图像处理库,提供了许多矩阵操作的函数和工具。本文将介绍如何使用OpenCV在Android上创建单......
  • OpenCV for .NET获取图片文字
    OpenCVfor.NET获取图片文字随着人工智能的快速发展,图像处理技术在各个领域都得到了广泛应用。而文字识别作为图像处理的一个重要应用之一,能够将图片中的文字提取出来,为后续的文字分析和处理提供基础。OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。本文......