我想知道是否有一种方法可以通过分析图像数据来确定图像是否模糊。
当前回答
是的,它是。计算快速傅里叶变换并分析结果。傅里叶变换告诉你图像中出现了哪些频率。如果有少量的高频,那么图像是模糊的。
定义术语“低”和“高”取决于你。
编辑:
正如评论中所述,如果你想用一个浮点数来表示给定图像的模糊度,你必须计算出一个合适的度量。
尼基的回答提供了这样一个衡量标准。将图像与拉普拉斯核进行卷积:
1
1 -4 1
1
并且在输出上使用一个健壮的最大度量来获得一个可以用于阈值的数字。在计算拉普拉斯函数之前尽量避免平滑过多的图像,因为你只会发现平滑后的图像确实是模糊的:-)。
其他回答
上面的回答阐明了许多事情,但我认为做一个概念上的区分是有用的。
如果你对一个模糊的图像拍摄一张完美对焦的照片呢?
The blurring detection problem is only well posed when you have a reference. If you need to design, e.g., an auto-focus system, you compare a sequence of images taken with different degrees of blurring, or smoothing, and you try to find the point of minimum blurring within this set. I other words you need to cross reference the various images using one of the techniques illustrated above (basically--with various possible levels of refinement in the approach--looking for the one image with the highest high-frequency content).
是的,它是。计算快速傅里叶变换并分析结果。傅里叶变换告诉你图像中出现了哪些频率。如果有少量的高频,那么图像是模糊的。
定义术语“低”和“高”取决于你。
编辑:
正如评论中所述,如果你想用一个浮点数来表示给定图像的模糊度,你必须计算出一个合适的度量。
尼基的回答提供了这样一个衡量标准。将图像与拉普拉斯核进行卷积:
1
1 -4 1
1
并且在输出上使用一个健壮的最大度量来获得一个可以用于阈值的数字。在计算拉普拉斯函数之前尽量避免平滑过多的图像,因为你只会发现平滑后的图像确实是模糊的:-)。
这就是我在Opencv中检测区域焦点质量的方法:
Mat grad;
int scale = 1;
int delta = 0;
int ddepth = CV_8U;
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
/// Gradient X
Sobel(matFromSensor, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
/// Gradient Y
Sobel(matFromSensor, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
cv::Scalar mu, sigma;
cv::meanStdDev(grad, /* mean */ mu, /*stdev*/ sigma);
focusMeasure = mu.val[0] * mu.val[0];
我想到了一个完全不同的解决方案。 我需要分析视频静止帧,以便在每(X)帧中找到最清晰的帧。这样,我将检测运动模糊和/或失焦图像。
我最终使用了Canny边缘检测,我得到了非常非常好的结果,几乎每一种视频(与尼基的方法,我有数字化的VHS视频和沉重的交错视频的问题)。
我通过在原始图像上设置感兴趣区域(ROI)来优化性能。
使用EmguCV:
//Convert image using Canny
using (Image<Gray, byte> imgCanny = imgOrig.Canny(225, 175))
{
//Count the number of pixel representing an edge
int nCountCanny = imgCanny.CountNonzero()[0];
//Compute a sharpness grade:
//< 1.5 = blurred, in movement
//de 1.5 à 6 = acceptable
//> 6 =stable, sharp
double dSharpness = (nCountCanny * 1000.0 / (imgCanny.Cols * imgCanny.Rows));
}
我目前使用的一种方法是测量图像中边缘的分布。请看这篇论文:
@ARTICLE{Marziliano04perceptualblur,
author = {Pina Marziliano and Frederic Dufaux and Stefan Winkler and Touradj Ebrahimi},
title = {Perceptual blur and ringing metrics: Application to JPEG2000,” Signal Process},
journal = {Image Commun},
year = {2004},
pages = {163--172} }
它通常都是付费版本,但我也看到过一些免费版本。基本上,他们在图像中定位垂直边缘,然后测量这些边缘的宽度。平均宽度给出了图像的最终模糊估计结果。较宽的边缘对应模糊的图像,反之亦然。
该问题属于无参考图像质量估计领域。如果你在谷歌Scholar上查一下,你会得到很多有用的参考资料。
EDIT
下面是nickie发布的5张图片的模糊估计图。数值越高,模糊程度越高。我使用固定大小的11x11高斯滤波器,并改变了标准偏差(使用imagemagick的convert命令来获得模糊的图像)。
如果你比较不同大小的图像,不要忘记通过图像宽度归一化,因为较大的图像会有更宽的边缘。
最后,一个重要的问题是区分艺术模糊和不必要的模糊(由对焦缺失、压缩、拍摄对象相对于相机的运动引起),但这超出了像这样简单的方法。举个艺术模糊的例子,看看莱娜的形象:莱娜在镜子里的倒影是模糊的,但她的脸是完美的聚焦。这有助于对莱纳图像进行更高的模糊估计。
推荐文章
- 使用ImageMagick“Diff”图像
- 如何使用pip安装opencv ?
- 如何用OpenCV2.0和Python2.6调整图像大小
- 如何消除数独方块的凹凸缺陷?
- ImportError: numpy.core.multiarray导入失败
- 我如何量化两幅图像之间的差异?
- 有没有办法检测图像是否模糊?
- 简单和快速的方法来比较图像的相似性
- 如何合并一个透明的png图像与另一个图像使用PIL
- 提取和保存视频帧
- 如何使用c#裁剪图像?
- 什么是最好的java图像处理库/方法?
- 给出一个图像来表示和解决一个迷宫
- 如何通过Conda安装Python OpenCV ?
- 推荐使用ImageMagick压缩JPG文件