【发布时间】:2011-07-29 09:04:16
【问题描述】:
我只是想问问有没有你推荐的资源可以简单描述Image smoothing。
谢谢。
【问题讨论】:
-
“图像平滑”有很多含义。 (通常是某种低通滤波器,但有时人们用它来描述完全不同的操作。)你想做什么?
标签: image-processing
我只是想问问有没有你推荐的资源可以简单描述Image smoothing。
谢谢。
【问题讨论】:
标签: image-processing
就像提到的一些评论者一样,图像平滑可能意味着很多事情。但主要是,当有人使用该术语时,他们的意思是模糊或低通滤波。这些通常用作同义词。作为视觉生物,模糊的概念对我们来说是直观的,但它的真正含义是什么?
当使用失焦的相机镜头时,这意味着从物体反射的光线在我们的视野中混合。这是代表专注视觉的图像:
这是一个类似的图表,表示模糊或不聚焦视觉:
为了以数字方式再现这种效果,让我们取图像的每个像素,并将其替换为自身及其相邻 8 个像素的平均值:
上图是 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 像素值的棋盘图像。
现在让我们用原始像素所在位置的平均 4x4 正方形替换每个像素:
. . . . . X 。 . . . . . . . . .您看到,由于棋盘格图案,每个这样的正方形的平均值将为 255/2 = 127(再次整数除法)。棋盘像素的变化从一个像素到另一个像素都非常剧烈。从任何像素到它的邻居,我们从可能的最高像素值到可能的最低像素值。这被称为高频内容。在进行平均时,我们会移除这个高频分量,因此,在信号处理术语中,我们正在执行高阻滤波,或者同义词,低通滤波。不要担心边缘上的奇怪伪影。它们存在是因为在对图像边缘进行过滤时,我们缺少要平均的像素,因此我们假设图像之外的所有东西都是黑色的。
让我们对常规灰度图像执行相同类型的平均。下面是著名的Lenna 图像。旁边是使用 7x7 平均 mask 的平均版本。您可以看到它是平滑的或模糊的。
这是一个通过平均来平滑图像的非常简单的示例。平均只是低通滤波的一种特殊情况。通常,我们执行加权平均以实现所需的低通滤波器效果。为了进一步阅读,我建议查找滤波器理论和卷积。
我希望这会有所帮助。
【讨论】:
Image Smoothing 通常与Low Pass Filtering 或getting rid of the high frequencies 同义。
背景 - 什么是过滤:
大多数人都直观地了解什么是过滤。您将某些东西通过过滤器并删除某些东西,并且输出中没有您过滤掉的物质。在 images/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 中。有关更多信息,请在 google 上搜索卷积。
低通滤波:
现在您已经知道如何过滤一维信号了。你可以做一个低通滤波器。要进行低通滤波器,您需要创建一个仅让低频通过的滤波器 h。最简单的低通滤波器是矩形滤波器h = ones(1,N); h = h ./ N;(matlab 代码)。更复杂的滤镜是高斯滤镜(这在图像处理中非常常用。请参阅 Photoshop/Gimp 并查找“高斯模糊”)。有无数种方法可以创建低通滤波器。
要创建自定义低通滤波器,请使用Parks-McClellan_filter_design_algorithm 创建任意特定低通滤波器。有关更多信息,请在 Google 上搜索“创建低通滤波器”。
最后回答你的问题——图像平滑:
要进行图像平滑,您在 1d 中执行相同的操作,但每次看到单个 for 循环时,您都有一个双 for 循环(因为您正在执行 2d 信号)。
创建过滤器也是类似的,但是您的过滤器 h 现在是二维的,而不是一维数组过滤器 h。
【讨论】: