图像处理 - 平滑

时间:2011-07-27 22:52:39

标签: image-processing

我只想询问您是否建议简单地描述Image smoothing

感谢。

2 个答案:

答案 0 :(得分:10)

与所提到的一些评论者一样,图像平滑可能意味着很多事情。主要是,当有人使用该术语时,他们的意思是模糊低通过滤。这些通常用于同义词。模糊的想法对我们来说是直观的视觉生物,但它究竟意味着什么?

当使用相机镜头失焦时,这意味着从物体反射的光线混合在我们的视野中。这是代表专注愿景的图片:

enter image description here

以下是代表模糊非焦点愿景的类似图表: enter image description here

为了以数字方式再现此效果,让我们拍摄图像的每个像素,并将其替换为自身及其相邻的八个像素的平均值: enter image description here

上图是7x7黑色方块内单个白色像素的图像。请注意,它只是一个白色像素,而不是整个像素的像素,只是非常夸张。在标准的8位图像表示中,这表示为以下

 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 
 0   0   0  255  0   0   0 
 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 

当我们执行平均时,用每个像素替换它周围3x3方形的所有像素的平均值(包括原始像素,我们得到

 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 
 0   0  28  28  28   0   0 
 0   0  28  28  28   0   0 
 0   0  28  28  28   0   0 
 0   0   0   0   0   0   0 
 0   0   0   0   0   0   0 

以上数字是整数,因为到目前为止我们只进行了整数运算,所以让我们保持一致。

现在看起来可能不像平滑,但让我们看看另一个例子。下面是一个更改0和255像素值的棋盘图像。

enter image description here

现在让我们将每个像素替换为4x4平方的平均值,其中原始像素的位置如下:

 . . . . 
 . X . . 
 . . . . 
 . . . . 

你看,由于棋盘图案,每个这样的正方形的平均值将是255/2 = 127(再次整数除法)。棋盘像素的改变在像素到像素之间非常激烈。从任何像素到其邻居,我们从最高可能像素值到最低可能像素值。这称为高频内容。平均时,我们会删除此高频分量,因此,在信号处理术语中,我们执行高阻滤波或同义地低通滤波。不要担心边缘有奇怪的瑕疵。它们在那里是因为当在图像的边缘上进行滤波时,我们缺少要平均的像素,因此我们假设图像之外的所有内容都只是黑色。

让我们在常规灰度图像上执行相同类型的平均。下面是着名的Lenna图片。它旁边是使用7x7平均掩码的平均版本。你可以看到它是平滑的模糊

enter image description here

这是通过平均进行图像平滑的一个非常简单的例子。平均只是低通滤波的一种特殊情况。通常,我们执行加权平均以实现所需的低通滤波器效果。为了进一步阅读,我建议查找滤波器理论和卷积。

我希望这会有所帮助。

答案 1 :(得分:2)

Image Smoothing通常与Low Pass Filteringgetting rid of the high frequencies同义。


背景 - 什么是过滤:

大多数人都明白过滤是直觉的。你拿东西并通过一个过滤器并删除一些东西,输出没有你过滤掉的物质。在图像/ 2d和1d信号中,您可以过滤。

在2d或1d图像上实现过滤的方法是对输入x和过滤器h进行卷积,以创建输出y。

以下是我在5分钟内编写的1d卷积示例,但没有检查错误:

void conv(float *x, int x_len, float * h, int h_len, float * y, int y_len)
{
 int i;
 register double accum;
 for(i = 0; i < x_len-h_len-1; i++) {
  accum = 0;
  for(j = 0; j < h_len; j++) {
   accum += x[i+j] * h[j];
  }
  y[i] = accum;
 }
}

int main {
 float x[] = {...};
 int x_len = sizeof(x)/sizeof(x[0]);
 float h[] = {...};
 int h_len = sizeof(h)/sizeof(h[0]);
 float y[x_len-h_len-1] = {0};
 int y_len = x_len-h_len-1;

 conv(x,x_len,h,h_len,y,y_len);
}

注意输入信号x如何被h过滤。然后输出存储在y中。有关谷歌搜索卷积的更多信息。


低通滤波:

现在您知道如何过滤1d信号了。你可以做一个低通滤波器。要进行低通滤波器,您需要创建一个仅允许低频通过的滤波器h。最简单的低通滤波器是矩形滤波器h = ones(1,N); h = h ./ N;(matlab代码)。更复杂的滤镜是高斯滤镜(这在图像处理中非常常用。请参阅Photoshop / Gimp并查找“高斯模糊”)。有无限的方法来创建低通滤波器。

要创建自定义低通滤波器,请使用Parks-McClellan_filter_design_algorithm创建任意特定的低通滤波器。有关更多信息,请搜索谷歌“创建低通滤波器”。


最后回答你的问题 - 图像平滑:

要进行图像平滑,你在1d中做同样的事情,但每次看到一个for循环时,你都有一个双循环(因为你正在做一个2d信号)。

创建过滤器也很相似,但是没有1d数组过滤器,h,你的过滤器h现在是二维的。