第3章图象的平滑(去噪声)、锐化 3.1平滑 先举个例子说明一下什么是平滑( smoothing),如下面两幅图所示:可以看到,图3.2比图3.1 柔和一些(也模糊一些)。是不是觉得很神奇?其实实现起来很简单。我们将原图中的每一点 的灰度和它周围八个点的灰度相加,然后除以9,作为新图中对应点的灰度,就能实现上面 的效果 图31原图 图3.2经过平滑处理后的图 这么做并非瞎蒙,而是有其道理的。大概想一想,也很容易明白。举个例子,就象和面一样, 先在中间加点水,然后不断把周围的面和进来,搅拌几次,面就均匀了。 用信号处理的理论来解释,这种做法实现的是一种简单的低通滤波器( ow pass filter)。哇 好深奧呀!不要紧,这些理论的内容并不多,而且知道一些理论也是很有好处的。在灰度连 续变化的图象中,如果出现了与相邻象素的灰度相差很大的点,比如说一片暗区中突然出现 了一个亮点,人眼能很容易觉察到。就象看老电影时,由于胶片太旧,屏幕上经常会出现 些亮斑。这种情况被认为是一种噪声。灰度突变在频域中代表了一种高频分量,低通滤波器 的作用就是滤掉高频分量,从而达到减少图象噪声的目的。 为了方便地叙述上面所说的“将原图中的每一点的灰度和它周围八个点的灰度相加,然后除 以9,作为新图中对应点的灰度”这一操作,我们采用如下的表示方法: 这种表示方法有点象矩阵,我们称其为模板 template)中间的黑点表示中心元素,即,用 哪个元素做为处理后的元素。例如[2.1表示将自身的2倍加上右边的元素作为新值,而[21] 表示将自身加上左边元素的2倍作为新值
第 3 章 图象的平滑(去噪声)、锐化 3.1 平滑 先举个例子说明一下什么是平滑(smoothing),如下面两幅图所示:可以看到,图 3.2 比图 3.1 柔和一些(也模糊一些)。是不是觉得很神奇?其实实现起来很简单。我们将原图中的每一点 的灰度和它周围八个点的灰度相加,然后除以 9,作为新图中对应点的灰度,就能实现上面 的效果。 图 3.1 原图 图 3.2 经过平滑处理后的图 这么做并非瞎蒙,而是有其道理的。大概想一想,也很容易明白。举个例子,就象和面一样, 先在中间加点水,然后不断把周围的面和进来,搅拌几次,面就均匀了。 用信号处理的理论来解释,这种做法实现的是一种简单的低通滤波器(low pass filter)。哇, 好深奥呀!不要紧,这些理论的内容并不多,而且知道一些理论也是很有好处的。在灰度连 续变化的图象中,如果出现了与相邻象素的灰度相差很大的点,比如说一片暗区中突然出现 了一个亮点,人眼能很容易觉察到。就象看老电影时,由于胶片太旧,屏幕上经常会出现一 些亮斑。这种情况被认为是一种噪声。灰度突变在频域中代表了一种高频分量,低通滤波器 的作用就是滤掉高频分量,从而达到减少图象噪声的目的。 为了方便地叙述上面所说的“将原图中的每一点的灰度和它周围八个点的灰度相加,然后除 以 9,作为新图中对应点的灰度”这一操作,我们采用如下的表示方法: (3.1) 这种表示方法有点象矩阵,我们称其为模板(template)。中间的黑点表示中心元素,即,用 哪个元素做为处理后的元素。例如[2. 1]表示将自身的 2 倍加上右边的元素作为新值,而[2 1.] 表示将自身加上左边元素的 2 倍作为新值
通常,模板不允许移出边界,所以结果图象会比原图小,例如模板是[01,原图是 3333x 22222 5555x 33333 7777x 经过模板操作后的图象为 [Xx xx对」:其中数字代表灰度,x 表示边界上无法进行模板操作的点,通常的做法是复制原图的灰度,不进行任何处理。 模板操作实现了一种邻域运算( Neighborhood Operation),即某个象素点的结果灰度不仅和该 象素灰度有关,而且和其邻域点的值有关。在以后介绍的细化算法中,我们还将接触到邻域 运算。模板运算的数学涵义是一种卷积(或互相关)运算,你不需要知道卷积的确切含义,只 要有这么一个概念就可以了。 模板运算在图象处理中经常要用到,可以看出,它是一项非常耗时的运算。以 21 16 为例,每个象素完成一次模板操作要用9个乘法、8个加法、1个除法。对于一幅n×n(宽 度×高度)的图象,就是9m2个乘法,8n2个加法和m2个除法,算法复杂度为O(m),这对于 大图象来说,是非常可怕的。所以,一般常用的模板并不大,如3×3,4×4。有很多专用 的图象处理系统,用硬件来完成模板运算,大大提高了速度。另外,可以设法将二维模板运 算转换成一维模板运算,对速度的提高也是非常可观的。例如,(3.2)式可以分解成一个水平 模板和一个垂直模板,即 16 4 16 12 我们来验证一下 X 设图象为5666,经过(32)式处理后变为[xx少 4645 4.564.56 ,经过(33)式处 X 3.06 x4.564.56x 理后变为[xxx对,两者完全一样。如果计算时不考虑周围一圈的象素,前者 做了4×(9个乘法,8个加法,1个除法),共36个乘法,32个加法,4个除法:后者做了4
通常,模板不允许移出边界,所以结果图象会比原图小,例如模板是 ,原图是 ,经过模板操作后的图象为 ;其中数字代表灰度,x 表示边界上无法进行模板操作的点,通常的做法是复制原图的灰度,不进行任何处理。 模板操作实现了一种邻域运算(Neighborhood Operation),即某个象素点的结果灰度不仅和该 象素灰度有关,而且和其邻域点的值有关。在以后介绍的细化算法中,我们还将接触到邻域 运算。模板运算的数学涵义是一种卷积(或互相关)运算,你不需要知道卷积的确切含义,只 要有这么一个概念就可以了。 模板运算在图象处理中经常要用到,可以看出,它是一项非常耗时的运算。以 (3.2) 为例,每个象素完成一次模板操作要用 9 个乘法、8 个加法、1 个除法。对于一幅 n×n(宽 度×高度)的图象,就是 9n2 个乘法,8n2 个加法和 n 2 个除法,算法复杂度为 O(n2 ),这对于 大图象来说,是非常可怕的。所以,一般常用的模板并不大,如 3×3,4×4。有很多专用 的图象处理系统,用硬件来完成模板运算,大大提高了速度。另外,可以设法将二维模板运 算转换成一维模板运算,对速度的提高也是非常可观的。例如,(3.2)式可以分解成一个水平 模板和一个垂直模板,即, = × = (3.3) 我们来验证一下。 设图象为 ,经过(3.2)式处理后变为 ,经过(3.3)式处 理后变为 ,两者完全一样。如果计算时不考虑周围一圈的象素,前者 做了 4×(9 个乘法,8 个加法,1 个除法),共 36 个乘法,32 个加法,4 个除法;后者做了 4
×(3个乘法,2个加法)+4×(3个乘法,2个加法)+4个除法,共24个乘法,16个加法,4 个除法,运算简化了不少,如果是大图,效率的提高将是非常客观的。 平滑模板的思想是通过将一点和周围8个点作平均,从而去除突然变化的点,滤掉噪声,其 代价是图象有一定程度的模糊。上面提到的模板(3,1),就是一种平滑模板,称之为Box模 板。Box模板虽然考虑了邻域点的作用,但并没有考虑各点位置的影响,对于所有的9个点 都一视同仁,所以平滑的效果并不理想。实际上我们可以想象,离某点越近的点对该点的影 24.2 响应该越大,为此,我们引入了加权系数,将原来的模板改造成 可以看 出,距离越近的点,加权系数越大 新的模板也是一个常用的平滑模板,称为高斯( Gauss)模板。为什么叫这个名字,这是因为 这个模板是通过采样2维高斯函数得到的。 22221 3233 4645 设图象为 5666 分别用两种平滑模板处理(周围一圈象素直接从原图拷贝)。采用 33.113.223 333.063 44334565 44564565 Box模板的结果为[566 ,采用高斯模板的结果为566 可以看到,原图中出现噪声的区域是第2行第2列和第3行第2列,灰度从2一下子跳到了 6,用Box模板处理后,灰度从3.11跳到4.33:用高斯模板处理后,灰度从3.跳到4.56,都 缓和了跳变的幅度,从这一点上看,两者都达到了平滑的目的。但是,原图中的第3,第4 行总的来说,灰度值是比较高的,经模板1处理后,第3行第2列元素的灰度变成了4.33, 与第3,第4行的总体灰度相比偏小,另外,原图中第3行第2列元素的灰度为6,第3行 第3列元素的灰度为4,变换后,后者4.56反而比前者4.33大了。而采用高斯模板没有出 现这些问题,究其原因,就是因为它考虑了位置的影响 举个实际的例子:下图中,从左到右分别是原图,用高斯模板处理的图,用Boⅹ模板处理 的图,可以看出,采用高斯模板,在实现平滑效果的同时,要比Box模板清晰一些。 在学习锐化后,我们将给出一个通用的3×3模板操作的程序
×(3 个乘法,2 个加法)+4×(3 个乘法,2 个加法)+4 个除法,共 24 个乘法,16 个加法,4 个除法,运算简化了不少,如果是大图,效率的提高将是非常客观的。 平滑模板的思想是通过将一点和周围 8 个点作平均,从而去除突然变化的点,滤掉噪声,其 代价是图象有一定程度的模糊。上面提到的模板(3.1),就是一种平滑模板,称之为 Box 模 板。Box 模板虽然考虑了邻域点的作用,但并没有考虑各点位置的影响,对于所有的 9 个点 都一视同仁,所以平滑的效果并不理想。实际上我们可以想象,离某点越近的点对该点的影 响应该越大,为此,我们引入了加权系数,将原来的模板改造成 ,可以看 出,距离越近的点,加权系数越大。 新的模板也是一个常用的平滑模板,称为高斯(Gauss)模板。为什么叫这个名字,这是因为 这个模板是通过采样 2 维高斯函数得到的。 设图象为 ,分别用两种平滑模板处理(周围一圈象素直接从原图拷贝)。采用 Box 模板的结果为 ,采用高斯模板的结果为 。 可以看到,原图中出现噪声的区域是第 2 行第 2 列和第 3 行第 2 列,灰度从 2 一下子跳到了 6,用 Box 模板处理后,灰度从 3.11 跳到 4.33;用高斯模板处理后,灰度从 3.跳到 4.56,都 缓和了跳变的幅度,从这一点上看,两者都达到了平滑的目的。但是,原图中的第 3,第 4 行总的来说,灰度值是比较高的,经模板 1 处理后,第 3 行第 2 列元素的灰度变成了 4.33, 与第 3,第 4 行的总体灰度相比偏小,另外,原图中第 3 行第 2 列元素的灰度为 6,第 3 行 第 3 列元素的灰度为 4,变换后,后者 4.56 反而比前者 4.33 大了。而采用高斯模板没有出 现这些问题,究其原因,就是因为它考虑了位置的影响。 举个实际的例子:下图中,从左到右分别是原图,用高斯模板处理的图,用 Box 模板处理 的图,可以看出,采用高斯模板,在实现平滑效果的同时,要比 Box 模板清晰一些。 在学习锐化后,我们将给出一个通用的 3×3 模板操作的程序
图3.3高斯模板和Box模板的对比图 3中值滤波 中值滤波也是一种典型的低通滤波器,它的目的是保护图象边缘的同时去除噪声。所谓中值 滤波,是指把以某点(xy)为中心的小窗口内的所有象素的灰度按从大到小的顺序排列,将中 间值作为(xy)处的灰度值(若窗口中有偶数个象素,则取两个中间值的平均)。中值滤波是如 何去除噪声的呢?举个例子就很容易明白了。 原图 处理后的图 0000000 00000 0000000 00000 0011100 01 0016100 0011100 0000000 图中数字代表该处的灰度。可以看出原图中间的6和周围的灰度相差很大,是一个噪声点 经过3×1窗口(即水平3个象素取中间值)的中值滤波,得到右边那幅图,可以看出,噪声 点被去除了。 下面将中值滤波和上面介绍的两种平滑模板作个比较,看看中值滤波有什么特点。我们以 维模板为例,只考虑水平方向,大小为3×I(宽x高,。B0x模板为11.1 高斯模 板为4121 先考察第一幅图: 原图 经Box模板处理后经Gaus模板处理后经中值滤波处理后
图 3.3 高斯模板和 Box 模板的对比图 3.2 中值滤波 中值滤波也是一种典型的低通滤波器,它的目的是保护图象边缘的同时去除噪声。所谓中值 滤波,是指把以某点(x,y)为中心的小窗口内的所有象素的灰度按从大到小的顺序排列,将中 间值作为(x,y)处的灰度值(若窗口中有偶数个象素,则取两个中间值的平均)。中值滤波是如 何去除噪声的呢?举个例子就很容易明白了。 原图 处理后的图 图中数字代表该处的灰度。可以看出原图中间的 6 和周围的灰度相差很大,是一个噪声点。 经过 3×1 窗口(即水平 3 个象素取中间值)的中值滤波,得到右边那幅图,可以看出,噪声 点被去除了。 下面将中值滤波和上面介绍的两种平滑模板作个比较,看看中值滤波有什么特点。我们以一 维模板为例,只考虑水平方向,大小为 3×1(宽×高)。Box 模板为 ,高斯模 板为 。 先考察第一幅图: 原图 经 Box 模板处理后 经 Gauss 模板处理后 经中值滤波处理后
12 000111 441001 11211 9339123312 11211 44 12331216161616 44 000111 12 001 44 从原图中不难看出左边区域灰度值低,右边区域灰度值高,中间有一条明显的边界,这一类 图象称之为stepˇ(就象灰度上了个台阶)。应用平滑模板后,图象平滑了,但是也使边界模 糊了。应用中值滤波,就能很好地保持原来的边界。所以说,中值滤波的特点是保护图象边 缘的同时去除噪声 再看第二幅图: 原图 经Box模板处理后经 Gauss模板处理后经中值滤波处理后 000 111 33333 000 9 00000 000 000 111 000 333 不难看出,原图中有很多噪声点(灰度为正代表灰度值高的点,灰度为负代表灰度值低的点 而且是杂乱无章,随机分布的。这也是一类很典型的图,称之为高斯噪声。经过Box平滑, 噪声的程度有所下降。 Gauss模板对付高斯噪声非常有效。而中值滤波对于髙斯噪声则无能 为力。 最后看第三幅图: 原图 经Box模板处理后经 Gauss模板处理后经中值滤波处理后 131413 121021 333 4 4 222 131131 333 121021 131413 2 6 333 4 4 从原图中不难看出,中间的灰度要比两边高许多。这也是一类很典型的图,称之为脉冲 ( impulse)。可见,中值滤波对脉冲噪声非常有效。 综合以上三类图,不难得出下面的结论:中值滤波容易去除孤立点,线的噪声同时保持图象 的边缘:它能很好的去除二值噪声,但对高斯噪声无能为力。要注意的是,当窗口内噪声点 的个数大于窗口宽度的一半时,中值滤波的效果不好。这是很显然的。 下面的程序实现了中值滤波,参数Hori是一个布尔变量,若为真,做水平中值滤波,否则 做垂直中值滤波。 BOOL Median Filter(HWND hWnd, BOOL Hori)
从原图中不难看出左边区域灰度值低,右边区域灰度值高,中间有一条明显的边界,这一类 图象称之为“step”(就象灰度上了个台阶)。应用平滑模板后,图象平滑了,但是也使边界模 糊了。应用中值滤波,就能很好地保持原来的边界。所以说,中值滤波的特点是保护图象边 缘的同时去除噪声。 再看第二幅图: 原图 经 Box 模板处理后 经 Gauss 模板处理后 经中值滤波处理后 不难看出,原图中有很多噪声点(灰度为正代表灰度值高的点,灰度为负代表灰度值低的点), 而且是杂乱无章,随机分布的。这也是一类很典型的图,称之为高斯噪声。经过 Box 平滑, 噪声的程度有所下降。Gauss 模板对付高斯噪声非常有效。而中值滤波对于高斯噪声则无能 为力。 最后看第三幅图: 原图 经 Box 模板处理后 经 Gauss 模板处理后 经中值滤波处理后 从原图中不难看出,中间的灰度要比两边高许多。这也是一类很典型的图,称之为脉冲 (impulse)。可见,中值滤波对脉冲噪声非常有效。 综合以上三类图,不难得出下面的结论:中值滤波容易去除孤立点,线的噪声同时保持图象 的边缘;它能很好的去除二值噪声,但对高斯噪声无能为力。要注意的是,当窗口内噪声点 的个数大于窗口宽度的一半时,中值滤波的效果不好。这是很显然的。 下面的程序实现了中值滤波,参数 Hori 是一个布尔变量,若为真,做水平中值滤波,否则, 做垂直中值滤波。 BOOL MedianFilter(HWND hWnd,BOOL Hori)