用代码实现图像的去噪
2015-06-28 12:23
267 查看
最近学了点图像处理,就顺带写了一个简易的图像处理的程序。这程序是用c++编写的,在这期博客中我主要说下图像的去噪。我程序中用了两种去噪的方法:1.加权滤波;2.中值滤波。从作品的最终效果来看,加权滤波的效果没有中值好,因此在这我着重说的是中值滤波。
因为我们的图片都是网上找的,一般都没有噪点,所以我们第一步就是要堆图片进行加澡。我加噪使用随机函数来实现的,在图像上随机产生任意个数的噪声点。代码如下:
给图像加上噪声有,接下来要做的就是去噪了。首先说下中值滤波中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。具体方法是用某种结构的二维滑动模板(我使用3*3的模板),将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)}
,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。
代码如下:
因为我们的图片都是网上找的,一般都没有噪点,所以我们第一步就是要堆图片进行加澡。我加噪使用随机函数来实现的,在图像上随机产生任意个数的噪声点。代码如下:
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); } }
相关文章推荐
- 源码分析之struts1自定义方法的使用与执行过程
- python实现搜索指定目录下文件及文件内搜索指定关键词的方法
- 分析用Python脚本关闭文件操作的机制
- Double-Checked Locking is Fixed In C++11
- [Python] 利用Django进行Web开发系列(一)
- eclipse3.7 安装maven插件与scm
- Google地图接口API之地图控件集(五)
- Android中如何使用JUnit进行单元测试 eclipse
- C语言中~的用法
- 用递归方法求n阶勒让德多项式的值
- Ruby on Rails Tutorial 第一章 之 Git项目管理
- Python遍历文件夹和读写文件的方法
- WEB开发教程--ASP中静态数组与动态数组的用法
- C#访问命令行的两种方法
- 2015062806 - EffactiveJava笔记 - 第41条 慎用重载(2)
- C#图片灰度处理(位深度24→位深度8)
- Java数组备忘录
- java.util.logging.Logger使用详解
- C#显式地实现接口成员的方法
- Hanoi(汉诺塔)问题。