我正在寻找一种“非常”简单的方法来检查图像位图是否模糊。我不需要精确和复杂的算法,比如fft、小波等。只要一个非常简单的想法,即使它不准确。
我考虑计算像素(x,y)和像素(x+1,y)之间的RGB分量的平均欧几里得距离,然后使用阈值,但效果很差。还有其他想法吗?
我正在寻找一种“非常”简单的方法来检查图像位图是否模糊。我不需要精确和复杂的算法,比如fft、小波等。只要一个非常简单的想法,即使它不准确。
我考虑计算像素(x,y)和像素(x+1,y)之间的RGB分量的平均欧几里得距离,然后使用阈值,但效果很差。还有其他想法吗?
这个算法存在一个问题,即它依赖于图像具有相当高的对比度以及锐利的边缘。可以通过找到最大像素差(maxdiff),并在以该位置为中心的小区域内找到像素值的整体范围(range)来改进它。然后按照以下方式计算清晰度:
sharpness = (maxdiff / (offset + range)) * (1.0 + offset / 255) * 100%
其中,offset是一个参数,它减少了非常小的边缘的影响,以使背景噪声不会对结果产生显著影响。(我使用了15的值。)
这会产生相当不错的结果。任何清晰度低于40%的东西可能都是模糊的。以下是一些示例(最大像素差和9×9本地搜索区域的位置也显示出来,供参考):
然而,结果仍然不完美。本质上模糊的主题始终会导致较低的清晰度值:
Bokeh效果可以从光的点源产生锐利的边缘,即使它们完全失焦:
您提到希望能够拒绝用户提交的失焦照片。由于这种技术并不完美,我建议您在图像模糊时通知用户,而不是完全拒绝它。
$maxv-$minv==0
时,该值被选择为输出0.0的值,当$maxv-$minv==255
时,该值被选择为输出100.0的值。 - r3mainer1 2 E = --- Σ I,其中I为图像,N为像素数(在灰度下定义) N
首先,您可以应用高斯拉普拉斯算子(LoG)滤波器来检测图像的“能量”区域,然后检查能量。模糊图像应显示出明显较低的能量。
在MATLAB中查看一个使用典型灰度lena图像的示例:
这是原始图像
这是模糊的图像,带有高斯噪声
这是原始图像的LoG图像
这是模糊图像的LoG图像
如果您只计算这两个LoG图像的能量,则会得到:
E = 1265 E = 88 or bl
这是巨大的差异...
然后,您只需要选择一个阈值来判断哪个能量适合您的应用...
N1=1/(2*N_pixel) * sum( abs(p(x,y)-p(x-1,y)) + abs(p(x,y)-p(x,y-1)) )
N2= 1/(2*N_pixel) * sum( (p(x,y)-p(x-1,y))^2 + (p(x,y)-p(x,y-1))^2 )
然后比率 N2 / (N1*N1) 是模糊度的一种度量。这适用于灰度图像,对于彩色图像,需要分别针对每个通道进行计算。