我可能晚了回答这个问题,但是这里有一个潜在的方法。可以使用pypi中的blur_detector库来识别图像中清晰和模糊的区域。以下是创建该库的论文:
https://arxiv.org/pdf/1703.07478.pdf
该库的操作方式是,在多个尺度上查看图像中的每个像素,并在每个尺度上执行离散余弦变换。然后过滤这些DCT系数,以便仅使用高频系数。在多个尺度上,所有高频DCT系数被融合在一起并排序,形成多尺度融合和排序的高频变换系数。选择这些排序系数的子集。这是一个可调参数,用户可以根据应用程序进行实验。所选DCT系数的输出随后通过最大池化发送以保留多个尺度的最大激活。这使得算法非常稳健,可以检测图像中的模糊区域。
这是我在您提供的图片中看到的结果:
![enter image description here](https://istack.dev59.com/L0N25.webp)
注:我使用了opencv默认的级联检测器中的人脸检测器来选择感兴趣区域。这两种方法的输出(空间模糊检测+人脸检测)可以用于获取图像的清晰度图。
在这里,我们可以看到在清晰的图像中,眼睛区域像素的强度非常高,而在模糊的图像中则很低。
您可以对此进行阈值处理,以识别哪些图像是清晰的,哪些图像是模糊的。
以下是生成上述结果的代码片段:
pip install blur_detector
import blur_detector
import cv2
if __name__ == '__main__':
face_cascade = cv2.CascadeClassifier('cv2/data/haarcascade_frontalface_default.xml')
img = cv2.imread('1.png', 0)
blur_map1 = blur_detector.detectBlur(img, downsampling_factor=1, num_scales=3, scale_start=1)
faces = face_cascade.detectMultiScale(img, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(blur_map1, (x, y), (x + w, y + h), (255, 0, 0), 2)
img = cv2.imread('2.png', 0)
blur_map2 = blur_detector.detectBlur(img, downsampling_factor=1, num_scales=3, scale_start=1)
faces = face_cascade.detectMultiScale(img, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(blur_map2, (x, y), (x + w, y + h), (255, 0, 0), 2)
img = cv2.imread('3.png', 0)
blur_map3 = blur_detector.detectBlur(img, downsampling_factor=1, num_scales=3, scale_start=1)
faces = face_cascade.detectMultiScale(img, 1.1, 4)
for (x, y, w, h) in faces:
cv2.rectangle(blur_map3, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow('a', blur_map1)
cv2.imshow('b', blur_map2)
cv2.imshow('c', blur_map3)
cv2.waitKey(0)
要了解关于模糊检测算法的详细信息,请查看此github页面:https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python