您的位置:首页 > 编程语言

用代码实现图像的去噪

2015-06-28 12:23 267 查看
最近学了点图像处理,就顺带写了一个简易的图像处理的程序。这程序是用c++编写的,在这期博客中我主要说下图像的去噪。我程序中用了两种去噪的方法:1.加权滤波;2.中值滤波。从作品的最终效果来看,加权滤波的效果没有中值好,因此在这我着重说的是中值滤波。

因为我们的图片都是网上找的,一般都没有噪点,所以我们第一步就是要堆图片进行加澡。我加噪使用随机函数来实现的,在图像上随机产生任意个数的噪声点。代码如下:

void jiazao( const Mat &img,Mat &img2)
{
int img2_width,img2_height;
img2_height = img.rows;
img2_width = img.cols;
img2= img.clone();
srand((unsigned int)time(NULL));
for(int i=0;i<100;i++)
{
int x=(int)rand()%img2_width;
int y=(int)rand()%img2_height;
if((x>0&&x<img.cols)&&(y>0&&y<img.rows))
{
img2.at<uchar>(y, x) = 255;
}

}
}
srand()是随机函数。

给图像加上噪声有,接下来要做的就是去噪了。首先说下中值滤波中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。具体方法是用某种结构的二维滑动模板(我使用3*3的模板),将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)}
,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。

代码如下:
//中值滤波
void Zhongzhi(const Mat &img2, Mat &img3,int temp[])
{
int width, height, img3_width, img3_height;
int t = 1;
img3_height = img2.rows;
img3_width = img2.cols;
width = img3_width - t;
height = img3_height - t;
img3.create(img3_height, img3_width, CV_8UC1);
int k;
for (int i = 0; i < img3_width; i++)
for (int j = 0; j < img3_height; j++)
{
if (i > t&&j > t&&i < width&&j < height)
{
k = 0;
for (int m = i - t; m <= i + t; m++)
for (int n = j - t; n <= j + t; n++)
{
temp[k] = img2.at<uchar>(n, m);
k++;
}
int z = 8;
int swap = 0;
for (int m = 0; m < z;m++)
for (int n = 0; n < z - m; n++)
{
if (temp
>temp[n + 1])
{
swap = temp
;
temp
=temp[n + 1];
temp[n + 1] = swap;
}

}
img3.at<uchar>(j, i) = temp[z/2];
}
else
img3.at<uchar>(j, i) = img3.at<uchar>(j, i);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: