我正在研究图像的模糊检测。我在OpenCV中使用了拉普拉斯方法的方差。
img = cv2.imread(imgPath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
value = cv2.Laplacian(gray, cv2.CV_64F).var()
该功能在某些情况下失败,如像素化模糊。它显示了比实际清晰图像更高的模糊图像值。有没有更好的方法来检测像素化模糊以及运动模糊?
示例图像:
此图像更清晰,但显示值为266.79
其中,如图所示,值为446.51。
此外,此图像似乎更清晰,但显示值仅为38.96
我需要将第一个和第三个分类为非模糊,而将第二个分类为模糊。
2条答案
按热度按时间jw5wzhpr1#
这个问题我可能会回答得晚一些,但这里有一个潜在的方法。pypi中的blur_detector库可以用来识别图像中清晰与模糊的区域。下面是创建该库的纸张:https://arxiv.org/pdf/1703.07478.pdf
该库的工作方式是在多个尺度下查看图像中的每个像素,并在每个尺度下执行离散余弦变换。然后,对这些DCT系数进行滤波,以便仅使用
high frequency
系数。然后,将多个尺度下的所有high frequency
DCT系数融合在一起并排序,以形成multiscale-fused and sorted high-frequency transform coefficients
。选择这些排序系数的子集。这是一个可调参数,用户可以根据应用进行试验。选定DCT系数的输出通过最大值池发送,以在多个尺度下保持最大激活。这使得算法在检测图像模糊区域时非常稳健。以下是我在您在问题中提供的图像上看到的结果:
注意:我已经使用了OpenCV中默认cascade_detectors中的一个人脸检测器来选择感兴趣区域。这两种方法(空间模糊检测+人脸检测)的输出可以用来获得图像中的锐度图。
这里我们可以看到,在清晰的图像中,眼睛区域中的像素的强度非常高,而对于模糊的图像,其强度较低。
您可以设置阈值来识别哪些图像清晰,哪些图像模糊。
下面是生成上述结果的代码片段:
要了解模糊检测器算法的细节,请查看github页面:https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python
33qvvth12#
您可以尝试将阈值定义为float,因此对于每个低于阈值的结果==模糊。但是如果像素图像每次都显示非常高,即使不模糊,您可以检查另一个非常高的值。另一种方法可能是检测图片的焦点。