DIP-图像平滑化处理
第三节:图像平滑化前言
图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪音,模糊图像(噪音是图像中变化比较大的区域,也就是高频信息)。而高通滤波能够提取图像的边缘(边缘也是高频信息集中的区域)。根据滤波器的不同又可以分为均值滤波,加权均值滤波,中值滤波,KNN平滑滤波。
一、方法介绍
1.均值滤波
原理:在图像上,对待处理的像素给定一个模板,该模板包括了其周围的邻近像素。将模板中的全体像素的均值来替代原来的像素值的方法。
缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。
代码如下(示例):
void meanFilter(RGBQUAD** dataOfBmp_src, RGBQUAD** dataOfBmp_dst, DWORD width, DWORD height)
{
int dim = 3;//模板维度
double H0[dim][dim];//模板
for(int i=0;i<dim;i++){
for(int j=0;j<dim;j++){
H0[i][j] = 1.0 / (dim*dim); //dim*dim的括号必加!
}
}
double sumR,sumG,sumB;
for(DWORD i=0;i<height;i++)
for(DWORD j=0;j<width;j++)
{
sumR = 0;sumG = 0;sumB = 0;
if(i >= 0 && i+2 <= height-1 && j >= 0 && j+2 <= width-1){
for(int k = 0;k<dim;k++){
for(int l = 0;l<dim;l++){
sumR += dataOfBmp_src[i+k][j+l].rgbRed * H0[k][l];//存放卷积运算的和
sumG += dataOfBmp_src[i+k][j+l].rgbGreen * H0[k][l];
sumB += dataOfBmp_src[i+k][j+l].rgbBlue * H0[k][l];
}
}
dataOfBmp_dst[i+1][j+1].rgbRed = sumR;
dataOfBmp_dst[i+1][j+1].rgbGreen = sumG;
dataOfBmp_dst[i+1][j+1].rgbBlue = sumB;
}
else{
dataOfBmp_dst[i][j].rgbRed = dataOfBmp_src[i][j].rgbRed;
dataOfBmp_dst[i][j].rgbGreen = dataOfBmp_src[i][j].rgbGreen;
dataOfBmp_dst[i][j].rgbBlue = dataOfBmp_src[i][j].rgbBlue;
}
}
}
效果图:
2.加权均值滤波
均值滤波器中,模板内像素的权重都为一,其只是简单的像素加法平均
而,加权均值滤波器,对模板中的像素点赋予不同的权重,求的是像素的加权平均。
代码如下:
void weightedMeanFilter(RGBQUAD** dataOfBmp_src, RGBQUAD** dataOfBmp_dst, DWORD width, DWORD height)
{