准备工作:我们读取摄影师图像,这通常用于可视化图像处理算法,并添加一些运动模糊。
origIm = imread('cameraman.tif');
littleBlurredIm = imfilter(origIm,fspecial('motion',5,45),'replicate');
muchBlurredIm = imfilter(origIm,fspecial('motion',20,45),'replicate');
这为我们提供了以下图片作为起点:
![start images](https://istack.dev59.com/kYIjq.webp)
要计算拉普拉斯算子,您可以使用imgradient
函数,该函数返回幅值和角度,因此我们将简单地丢弃角度:
[lpOrigIm,~] = imgradient(origIm);
[lpLittleBlurredIm,~] = imgradient(littleBlurredIm);
[lpMuchBlurredIm,~] = imgradient(muchBlurredIm);
这将会给出:
![filtered images](https://istack.dev59.com/pHfc2.webp)
你可以直观地看到原始图像具有非常锐利和清晰的边缘。稍微模糊的图像仍然具有一些特征,而模糊程度较高的图像只包含少量非零值。
正如nikie在
this question中提出的答案,我们现在可以创建一些模糊测量值。一个(或多或少)健壮的度量标准可能是前0.1%值的中位数:
nPx = round(0.001*numel(origIm));
sortedOrigIm = sort(lpOrigIm(:));
sortedLittleBlurredIm = sort(lpLittleBlurredIm(:));
sortedMuchBlurredIm = sort(lpMuchBlurredIm(:));
measureOrigIm = median(sortedOrigIm(end-nPx+1:end));
measureLittleBlurredIm = median(sortedLittleBlurredIm(end-nPx+1:end));
measureMuchBlurredIm = median(sortedMuchBlurredIm(end-nPx+1:end));
这将得到以下结果:
Original image: 823.7
Little Blurred image: 593.1
Much Blurred image: 490.3
这是针对不同运动模糊角度和模糊振幅的模糊度量的比较。
![blurriness](https://istack.dev59.com/uet5f.webp)
最后,我在上面链接的答案中的测试图像上尝试了它:
![test images](https://istack.dev59.com/X6Q9d.webp)
这提供了
![blurriness test images](https://istack.dev59.com/FozQG.webp)
< p >
翻译: 如您所见,可以检测出图像是否模糊。但是,检测图像模糊程度似乎很困难,因为这也取决于模糊与场景之间的角度以及由于不完美的梯度计算。此外,绝对值非常依赖于场景,因此您可能需要在解释该值时加入一些关于场景的先验知识。