确定图像是否模糊
Determine if an image is blurred
我看到了很多关于这个的话题,我理解了这个理论,但我无法编写代码。
我有一些图片,我想确定它们是否模糊。我找到了一个库 (aforge.dll) 并用它来计算图像的 FFT。
例如,我正在处理两张图片:
我的代码在 C# 中:
public Bitmap PerformFFT(Bitmap Picture)
{
//Loade Image
ComplexImage output = ComplexImage.FromBitmap(Picture);
// Perform FFT
output.ForwardFourierTransform();
// return image
return = output.ToBitmap();
}
如何判断图像是否模糊?我对这个理论不是很满意,我需要具体的例子。我看到了 this post,但我不知道该怎么做。
编辑:
我会澄清我的问题。当我有一个复杂的二维数组 ComplexImage output
(图像 FFT)时,我可以使用什么 C# 代码(或伪代码)来确定图像是否模糊?
模糊图像的 FFT 结果在 high-frequency 区域中幅度较小。具有低索引(接近 Result[0][0]
)的数组元素表示 low-frequency 区域。
因此,将结果数组除以一些标准,将两个区域的幅度相加并进行比较。例如,select 结果数组(大小为 M)的四分之一 index<M/2
和 indexy<M/2
对于一系列越来越模糊的图像(对于相同的初始图像),您应该看到越来越高的比率 Sum(Low)/Sum(High)
结果是方阵 NxN。它具有中心对称性(F(x,y)=F(-x,-y)
因为源是纯实数),所以用 y<N/2
.
处理数组的上半部分就足够了
Low-frequency 组件位于数组的 top-left 和 top-right 角附近(y 的最小值,x 的最小值和最大值)。因此,对范围
中的数组元素求和
for y in range 0..N/2
for x in range 0..N
amp = magnitude(y,x)
if (y<N/4) and ((x<N/4)or (x>=3*N/4))
low = low + amp
else
high = high + amp
请注意,您的图片显示了混乱的数组片段 - 这是在中心显示零分量的标准做法。
"blurred"的概念是主观的。高频的多少功率表明它不模糊?请注意,复杂场景的模糊图像比非常简单场景的清晰图像在高频下具有更大的功率。例如,完全均匀场景的清晰图片没有任何高频。因此不可能定义唯一的模糊度度量。
可能的是比较同一场景的两张图像,并确定哪一张更模糊(或相同地,哪一张更清晰)。这就是自动对焦中使用的。我不知道商用相机究竟使用什么过程,但在显微镜下,图像是在一系列焦深处拍摄的,并进行比较。
其中一种经典比较方法根本不涉及傅里叶变换。一个计算局部方差(对于每个像素,在它周围取一个小的 window 并计算这些值的方差),并在整个图像上取平均值。具有最高方差的图像具有最佳焦点。
比较 would be comparable to computing the Laplace filtered 图像中的高频与低频,并对其绝对值取平均值(因为它可以 return 负值)。拉普拉斯滤波器是 high-pass 滤波器,意味着低频被移除。由于高频功率给出了清晰度的相对测量值,因此该统计数据也是如此(同样是相对的,它仅与在相同情况下拍摄的相同场景的图像进行比较)。
我看到了很多关于这个的话题,我理解了这个理论,但我无法编写代码。
我有一些图片,我想确定它们是否模糊。我找到了一个库 (aforge.dll) 并用它来计算图像的 FFT。
例如,我正在处理两张图片:
我的代码在 C# 中:
public Bitmap PerformFFT(Bitmap Picture)
{
//Loade Image
ComplexImage output = ComplexImage.FromBitmap(Picture);
// Perform FFT
output.ForwardFourierTransform();
// return image
return = output.ToBitmap();
}
如何判断图像是否模糊?我对这个理论不是很满意,我需要具体的例子。我看到了 this post,但我不知道该怎么做。
编辑:
我会澄清我的问题。当我有一个复杂的二维数组 ComplexImage output
(图像 FFT)时,我可以使用什么 C# 代码(或伪代码)来确定图像是否模糊?
模糊图像的 FFT 结果在 high-frequency 区域中幅度较小。具有低索引(接近 Result[0][0]
)的数组元素表示 low-frequency 区域。
因此,将结果数组除以一些标准,将两个区域的幅度相加并进行比较。例如,select 结果数组(大小为 M)的四分之一 index<M/2
和 indexy<M/2
对于一系列越来越模糊的图像(对于相同的初始图像),您应该看到越来越高的比率 Sum(Low)/Sum(High)
结果是方阵 NxN。它具有中心对称性(F(x,y)=F(-x,-y)
因为源是纯实数),所以用 y<N/2
.
Low-frequency 组件位于数组的 top-left 和 top-right 角附近(y 的最小值,x 的最小值和最大值)。因此,对范围
中的数组元素求和for y in range 0..N/2
for x in range 0..N
amp = magnitude(y,x)
if (y<N/4) and ((x<N/4)or (x>=3*N/4))
low = low + amp
else
high = high + amp
请注意,您的图片显示了混乱的数组片段 - 这是在中心显示零分量的标准做法。
"blurred"的概念是主观的。高频的多少功率表明它不模糊?请注意,复杂场景的模糊图像比非常简单场景的清晰图像在高频下具有更大的功率。例如,完全均匀场景的清晰图片没有任何高频。因此不可能定义唯一的模糊度度量。
可能的是比较同一场景的两张图像,并确定哪一张更模糊(或相同地,哪一张更清晰)。这就是自动对焦中使用的。我不知道商用相机究竟使用什么过程,但在显微镜下,图像是在一系列焦深处拍摄的,并进行比较。
其中一种经典比较方法根本不涉及傅里叶变换。一个计算局部方差(对于每个像素,在它周围取一个小的 window 并计算这些值的方差),并在整个图像上取平均值。具有最高方差的图像具有最佳焦点。
比较