这一节,谈一谈如何对图像进行平滑,也可以叫做模糊。平滑图像的主要目的是减少噪声,这样采用平滑图像来降低噪声是是非常常见的预处理方法。
1.归一化滤波平滑-Homogeneous Smoothing
2.高斯滤波平滑-Gaussian Smoothing
3.中值滤波平滑-Median Smoothing
4.双边滤波平滑-Bilateral Smoothing
平滑是通过滑动窗口(内核或过滤器)扫描整个图像窗口,计算每个像素的基于核的值的和重叠的原始图像的像素的值的值来完成。这个过程在数学上称为具有一些内核卷积的图像。上述4种不同平滑方法唯一的区别就是内核。
例如, 5 x 5的核用来平滑(模糊)下面图片, 归一化块滤波器"Normalized box filter".
例如, 5 x 5的核用来平滑(模糊)下面图片, 归一化块滤波器"Normalized box filter".
而高斯平滑(模糊)采用5x5的内核是如下。这个内核被称为“高斯核” "Gaussian kernel"
下面是关于平滑核(滤波器)比较重要的几个方面。
- 平滑核的行像素数及列像素数必须是奇数(e.g. - 3x3, 11x5, 7x7, etc)
- 平滑核的size越大,计算时间越长。
归一化滤波平衡 Homogeneous Smoothing
简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)
选择核的大小是很关键,如果选择太大,比较细微的图像特征可能被平滑掉,图像看起来很模糊。如果核选择太小,就可能无法完全删除噪声。
核定义如下:
OpenCV 代码
下面的OpenCV 的代码中,核大小从1x1增加到29x29.可以观察到图像平滑程度随着核增大的变化程度。平滑图像的核的大小显示在被平滑图像上。
//
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main( int argc, char** argv )
{
//create 2 empty windows
namedWindow( "Original Image" , CV_WINDOW_AUTOSIZE );
namedWindow( "Smoothed Image" , CV_WINDOW_