我想检测图像的模糊程度,可能是“模糊延伸”。 我找到了一篇有用的论文:
http://www.cs.cmu.edu/~htong/pdf/ICME04_tong.pdf
我使用了OpenCV并实现了本文的所有步骤,但结果与本文的结果不同。
有人可以给我任何关于检测“模糊延伸”的建议吗?
答案 0 :(得分:3)
您可以使用下一个算法检测模糊图像:
计算灰度图像的最大绝对二阶导数(对于每个点):
d[x,y] = max(abs(2*d[x,y] - d[x,y+1] -d[x,y-1]), abs(2*d[x,y] - d[x+1,y] -d[x-1,y]));
计算此估计图像的直方图(最大绝对二阶导数)。
找到此直方图的上分位数(0,999)。
如果此值小于阈值(图像动态范围约为25%),则图像模糊。
如果要估算模糊值,请执行步骤2-5以缩小图像。
您可以自己编写这些算法,也可以使用Simd Library的实现方法(免责声明:我是作者)。
Simd::BgrToGray
或Simd::BgraToGray
(针对第1步)。Simd::AbsSecondDerivativeHistogram
(步骤2-5)。Simd::ReduceGray2x2
(步骤6)。答案 1 :(得分:0)
Ermlg的答案似乎是最好的,但是通过这种方式,我实现了这一目标。
低于100的分数给了我一些模糊的图像。
# applying fast fourier transform to fin d the blur images , taken threshold to be 100 but it can vary
import cv2
def variance_of_laplacian(frame_path):
# compute the Laplacian of the image and then return the focus
# measure, which is simply the variance of the Laplacian
image = cv2.imread(frame_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
return cv2.Laplacian(gray, cv2.CV_64F).var()
方法的来源是adrian rosebrock
答案 2 :(得分:0)
这里需要注意的一个重点是图像可能有一些模糊区域和一些清晰区域。例如,如果图像包含人像摄影,则前景中的图像清晰,而背景中的图像模糊。在体育摄影中,对焦的物体很清晰,背景通常有运动模糊。检测图像中这种空间变化模糊的一种方法是在图像中的每个位置运行频域分析。其中一篇讨论该主题的论文是 "Spatially-Varying Blur Detection Based on Multiscale Fused and Sorted Transform Coefficients of Gradient Magnitudes" (cvpr2017)
。
multiscale-fused and sorted high-frequency transform coefficients
此模糊图可用于量化图像各个区域的锐度。为了得到一个单一的全局度量来量化整个图像的模糊度,可以使用这个模糊图的平均值或这个模糊图的直方图
图像中清晰的区域在 blur_map 中强度较高,而模糊区域的强度较低。
项目的github链接是:https://github.com/Utkarsh-Deshmukh/Spatially-Varying-Blur-Detection-python
这个算法的python实现可以在pypi上找到,安装很方便,如下图:
pip install blur_detector
生成模糊图的示例代码片段如下:
import blur_detector
import cv2
if __name__ == '__main__':
img = cv2.imread('image_name', 0)
blur_map = blur_detector.detectBlur(img, downsampling_factor=4, num_scales=4, scale_start=2, num_iterations_RF_filter=3)
cv2.imshow('ori_img', img)
cv2.imshow('blur_map', blur_map)
cv2.waitKey(0)