use*_*045 6 bitmap image-processing blur
我正在寻找一种"非常"简单的方法来检查图像位图是否模糊.我不需要精确和复杂的算法,涉及fft,小波等.即使它不准确也只是一个非常简单的想法.
我曾考虑计算像素(x,y)和像素(x + 1,y)之间的平均欧几里德距离,考虑它们的RGB分量,然后使用阈值,但它的工作非常糟糕.还有其他想法吗?
squ*_*age 16
不要计算相邻像素之间的平均差异.
即使照片完全聚焦,它仍然可以包含大面积的均匀颜色,例如天空.这些将降低平均差异并掩盖您感兴趣的细节.您真正想要找到的是最大差异值.
另外,为了加快速度,我不打算检查图像中的每个像素.你应该通过检查相隔10个像素的水平和垂直线网格来获得合理的结果.
以下是使用来自Wikimedia Commons(Bokeh_Ipomea.jpg)的图像的PHP GD图形函数的一些测试结果.这些Sharpness值只是最大像素差值的百分比为255(我只查看绿色通道;您应该首先转换为灰度).下面的数字显示了处理图像所需的时间.



如果你想要它们,这里是我使用的源图像:
该算法存在一个问题,即它依赖于具有相当高对比度的图像以及清晰的聚焦边缘.可以通过找到最大像素差(maxdiff)并在以该位置(范围)为中心的小区域中找到像素值的整体范围来改进.然后计算清晰度如下:
锐度 =(maxdiff /(偏移 + 范围))*(1.0 + 偏移/255)*100%
其中offset是一个减少非常小边缘影响的参数,因此背景噪声不会显着影响结果.(我使用了15的值.)
这产生了相当好的结果.任何锐度低于40%的东西都可能不在焦点之内.以下是一些示例(最大像素差异的位置和9×9局部搜索区域也显示供参考):
但结果仍然不完美.本质上模糊的主体将始终导致低锐度值:
散景效果可以从点光源产生锐边,即使它们完全失焦:
您评论说您希望能够拒绝用户提交的失焦照片.由于这种技术并不完美,我建议你改为通知用户图像是否模糊而不是完全拒绝它.