当前位置:首页 >> 信息与通信 >>

opencv


实验
实验 4:图像去噪

名称
1、掌握算术均值滤波器、几何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪的算 法 2、掌握利用中值滤波器进行图像去噪的算法 3、掌握自适应中值滤波算法 4、掌握自适应局部降低噪声滤波器去噪算法 5、掌握彩色图像去噪步骤 1、均值滤波 具体内容:利用 OpenCV 对灰度图像像素进行操作,分别利用算术均值滤

波器、几 何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪。模板大小为 5*5。 (注:请分别 为图像添加高斯噪声、胡椒噪声、盐噪声和椒盐噪声,并观察滤波效果) 2、中值滤波 具体内容:利用 OpenCV 对灰度图像像素进行操作,分别利用 5*5 和 9*9 尺寸的模 板对图像进行中值滤波。 (注:请分别为图像添加胡椒噪声、盐噪声和椒盐噪声,并观察

实验 目的

实验 内容

滤波效果) 3、自适应均值滤波。 具体内容:利用 OpenCV 对灰度图像像素进行操作,设计自适应局部降低噪声滤波 器去噪算法。模板大小 7*7(对比该算法的效果和均值滤波器的效果) 4、自适应中值滤波 具体内容:利用 OpenCV 对灰度图像像素进行操作,设计自适应中值滤波算法对椒 盐图像进行去噪。模板大小 7*7(对比中值滤波器的效果) 5、彩色图像均值滤波 具体内容:利用 OpenCV 对彩色图像 RGB 三个通道的像素进行操作,利用算术均 值滤波器和几何均值滤波器进行彩色图像去噪。模板大小为 5*5。

1、 实验步骤:先为灰度图像添加高斯噪声、胡椒噪声、盐噪声和椒盐噪声,再分别利用 算术均值滤波器、几何均值滤波器、谐波和逆谐波均值滤波器进行图像去噪。模板大 小为 5*5。 核心代码如下: 添加各类噪声: IplImage* AddGuassianNoise(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); IplImage* noise = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); CvRNG rng = cvRNG(-1); cvRandArr(&rng,noise,CV_RAND_NORMAL,cvScalarAll(0),cvScalarAll(15)); cvAdd(src,noise,dst); return dst; } IplImage* AddPepperNoise(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvCopy(src, dst); for(int k=0; k<8000; k++) // 添加胡椒噪声,随机黑色点 // 添加高斯噪声

实验 完成 情况

{ int i = rand()%src->height; int j = rand()%src->width; CvScalar s = cvGet2D(src, i, j); if(src->nChannels == 1) { s.val[0] = 0; } else if(src->nChannels==3) { s.val[0]=0; s.val[1]=0; s.val[2]=0; } cvSet2D(dst, i, j, s); } return dst; } IplImage* AddSaltNoise(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvCopy(src, dst); for(int k=0; k<8000; k++) { int i = rand()%src->height; // 添加盐噪声,随机白色点

int j = rand()%src->width; CvScalar s = cvGet2D(src, i, j); if(src->nChannels == 1) { s.val[0] = 255; } else if(src->nChannels==3) { s.val[0]=255; s.val[1]=255; s.val[2]=255; } cvSet2D(dst, i, j, s); } return dst; } IplImage* AddPepperSaltNoise(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvCopy(src, dst); for(int k=0; k<8000; k++) { int i = rand()%src->height; int j = rand()%src->width; int m = rand()%2; CvScalar s = cvGet2D(src, i, j); if(src->nChannels == 1) { if(m==0) { s.val[0] = 255; } else { s.val[0] = 0; } } else if(src->nChannels==3) { if(m==0) { s.val[0]=255; s.val[1]=255; s.val[2]=255; //添加椒盐噪声,随机黑白点

} else { s.val[0]=0; s.val[1]=0; s.val[2]=0; } } cvSet2D(dst, i, j, s); } return dst; } 各类滤波器实现: //算术均值滤波器——模板大小 5*5 IplImage* ArithmeticMeanFilter(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_BLUR,5); return dst; } //几何均值滤波器——模板大小 5*5 IplImage* GeometryMeanFilter(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); int row, col; int h=src->height; int w=src->width; double mul[3]; double dc[3]; int mn; //计算每个像素的去噪后 color 值 for(int i=0;i<src->height;i++){ for(int j=0;j<src->width;j++){ mul[0]=1.0; mn=0; //统计邻域内的几何平均值,邻域大小 5*5 for(int m=-2;m<=2;m++){ row = i+m; for(int n=-2;n<=2;n++){ col = j+n; if(row>=0&&row<h && col>=0 && col<w){ CvScalar s = cvGet2D(src, row, col); mul[0] = mul[0]*(s.val[0]==0?1:s.val[0]); 零像素点相乘

// 邻域内的非

mn++; } } } //计算 1/mn 次方 CvScalar d; dc[0] = pow(mul[0], 1.0/mn); d.val[0]=dc[0]; //统计成功赋给去噪后图像。 cvSet2D(dst, i, j, d); } } return dst; } //谐波均值滤波器——模板大小 5*5 IplImage* HarmonicMeanFilter(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); int row, col; int h=src->height; int w=src->width; double sum[3]; double dc[3]; int mn; //计算每个像素的去噪后 color 值 for(int i=0;i<src->height;i++){ for(int j=0;j<src->width;j++){ sum[0]=0.0; mn=0; //统计邻域,5*5 模板 for(int m=-2;m<=2;m++){ row = i+m; for(int n=-2;n<=2;n++){ col = j+n; if(row>=0&&row<h && col>=0 && col<w){ CvScalar s = cvGet2D(src, row, col); sum[0] = sum[0]+(s.val[0]==0?255:255/s.val[0]); mn++; } } } CvScalar d; dc[0] = mn*255/sum[0]; d.val[0]=dc[0];

//统计成功赋给去噪后图像。 cvSet2D(dst, i, j, d); } } return dst; } //逆谐波均值大小滤波器——模板大小 5*5 IplImage* InverseHarmonicMeanF ilter(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); //cvSmooth(src,dst,CV_BLUR,5); int row, col; int h=src->height; int w=src->width; double sum[3]; double sum1[3]; double dc[3]; double Q=2; //计算每个像素的去噪后 color 值 for(int i=0;i<src->height;i++){ for(int j=0;j<src->width;j++){ sum[0]=0.0; sum1[0]=0.0; //统计邻域 for(int m=-2;m<=2;m++){ row = i+m; for(int n=-2;n<=2;n++){ col = j+n; if(row>=0&&row<h && col>=0 && col<w){ CvScalar s = cvGet2D(src, row, col); sum[0] = sum[0]+pow(s.val[0]/255, Q+1); sum1[0] = sum1[0]+pow(s.val[0]/255, Q); } } } //计算 1/mn 次方 CvScalar d; dc[0] = (sum1[0]==0?0:(sum[0]/sum1[0]))*255; d.val[0]=dc[0]; //统计成功赋给去噪后图像。 cvSet2D(dst, i, j, d); } } return dst;

} 实验结果如图所示:(从左至右,从上至下分别为原图像、加噪图像、算术均值处理图像、 几何均值处理图像、谐波均值处理图像、逆谐波均值处理图像) (1)高斯噪声:

(2)胡椒噪声:

(3)盐噪声

(4)椒盐噪声

2、 实验步骤:先为灰度图像添加胡椒噪声、盐噪声和椒盐噪声,再分别利用 5*5 和 9*9 尺寸的模板对图像进行中值滤波。 核心代码如下: IplImage* MedianFilter_5_5(IplImage* src){ IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_MEDIAN,5); return dst; } IplImage* MedianFilter_9_9(IplImage* src){ IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_MEDIAN,9); return dst; } 实验结果如下图 (灰度图像和加噪图像第一问中已给出, 下面只列出分别利用 5*5 和 9*9 尺寸的模板对图像进行中值滤波后的图像) : 灰度图像加胡椒噪声,分别利用 5*5 和 9*9 尺寸的模板对图像进行中值滤波。

灰度图像加盐噪声,分别利用 5*5 和 9*9 尺寸的模板对图像进行中值滤波。

灰度图像加椒盐噪声,分别利用 5*5 和 9*9 尺寸的模板对图像进行中值滤波。

3、 实验步骤:自适应均值滤波(以高斯噪声为例) ,先为灰度图像添加高斯噪声,再利 用 7*7 尺寸的模板对图像进行自适应均值滤波。 核心代码如下: IplImage* SelfAdaptMeanFilter(IplImage* src){ IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_BLUR,7); int row, col; int h=src->height; int w=src->width; int mn; double Zxy; double Zmed; double Sxy; double Sl;

double Sn=100; for(int i=0;i<src->height;i++){ for(int j=0;j<src->width;j++){ CvScalar xy = cvGet2D(src, i, j); Zxy = xy.val[0]; CvScalar dxy = cvGet2D(dst, i, j); Zmed = dxy.val[0]; Sl=0; mn=0; for(int m=-3;m<=3;m++){ row = i+m; for(int n=-3;n<=3;n++){ col = j+n; if(row>=0&&row<h && col>=0 && col<w){ CvScalar s = cvGet2D(src, row, col); Sxy = s.val[0]; Sl = Sl+pow(Sxy-Zmed, 2); mn++; } } } Sl=Sl/mn; CvScalar d; d.val[0]=Zxy-Sn/Sl*(Zxy-Zmed); cvSet2D(dst, i, j, d); } } return dst; } 实验结果如图:

4、 实验步骤:自适应中值滤波(以椒盐噪声为例) ,先为灰度图像添加椒盐噪声,再利 用 7*7 尺寸的模板对图像进行自适应中值滤波。 核心代码如下: IplImage* SelfAdaptMedianFilter(IplImage* src){ IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); int row, col; int h=src->height; int w=src->width; double Zmin,Zmax,Zmed,Zxy,Smax=7; int wsize; //计算每个像素的去噪后 color 值 for(int i=0;i<src->height;i++){ for(int j=0;j<src->width;j++){ //统计邻域 wsize=1; while(wsize<=3){ Zmin=255.0; Zmax=0.0; Zmed=0.0; CvScalar xy = cvGet2D(src, i, j); Zxy=xy.val[0]; int mn=0; for(int m=-wsize;m<=wsize;m++){ row = i+m; for(int n=-wsize;n<=wsize;n++){ col = j+n; if(row>=0&&row<h && col>=0 && col<w){ CvScalar s = cvGet2D(src, row, col); if(s.val[0]>Zmax){ Zmax=s.val[0];

} if(s.val[0]<Zmin){ Zmin=s.val[0]; } Zmed=Zmed+s.val[0]; mn++; } } } Zmed = Zmed/mn; CvScalar d; if((Zmed-Zmin)>0 && (Zmed-Zmax)<0){ if((Zxy-Zmin)>0 && (Zxy-Zmax)<0){ d.val[0]=Zxy; }else{ d.val[0]=Zmed; } cvSet2D(dst, i, j, d); break; } else { wsize++; if(wsize>3){ CvScalar d; d.val[0]=Zmed; cvSet2D(dst, i, j, d); break; } } } } } return dst; } 实验结果如图:

5、 实验步骤:利用 OpenCV 对彩色图像 RGB 三个通道的像素进行操作,利用算术均 值滤波器和几何均值滤波器进行彩色图像去噪。模板大小为 5*5。 实验代码参照问题一,选择彩色图片、算术均值滤波器和几何均值滤波器进行彩色图 像去噪。 实验结果如下图(以椒盐噪声为例) : 利用算术均值滤波器:

利用几何均值滤波器:

实验 中的 问题
实验问题:几何均值滤波以及谐波、逆谐波滤波没有对应的库函数 解决方法:通过学习书本对应章节,根据公式写出程序

实验 结果


相关文章:
OPENCV 2.4.10安装
OPENCV 2.4.10安装_计算机软件及应用_IT/计算机_专业资料。一、 VS2020 安装 opencv2.4.10 1.1 首先安装 vs2010 安装这个就不用多谈了 1.2 下载 opencv-2.4...
Vsual Studio 2013 + Win764bit + OpenCV3.0配置文档
7 学习网站:http://www.opencv.org.cn/forum/ [优酷网有配置视频,直接搜索“OpenCV3.0 配置”] 以下内容都是 Open 文件夹里的 build 文件夹里的内容【以路径...
OpenCV入门教程
49 4 第 1 章 预备知识 OpenCV 是一个功能强大的计算机视觉库,要用好它,除了要具有相关的计算机 视觉理论知识外,还需要具有一定的编程能力。本书作者通过对 ...
Visual Studio2012环境下配置OpenCV_v2.4.10的步骤
Visual Studio2012 环境下配置 OpenCV 的步骤 2014/12/16 本文将针对 Visual Studio2012 环境下如何配置 OpenCV 做出说明,具体如下。 1. 下载和安装 OpenCV SDK ...
OpenCV下载与安装
OpenCV 下载与安装 可以在 http://opencv.org/downloads.html 上下载各种版本的 OpenCV 的源码,Windows、Linux/Mac、iOS、Android 都有相应的 版本,所以 OpenCV ...
OpenCV 2.4.4安装与配置
OpenCV 2.4.4 安装与配置步骤一:安装 OpenCV http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.4/ 1.从以上地址下载 OpenCV2.4.4,执行 exe...
VS2010使用OpenCV的配置过程-已通过多机实验的个人成果综合
VS2010使用OpenCV的配置过程-已通过多机实验的个人成果综合_IT/计算机_专业资料。VS2010使用OpenCV的配置过程,绝对是最详细的一份,这是我自己摸索出来的方法,其中...
OpenCV概述
三.OpenCV 的图像数据结构利用 OpenCV 编写图像处理或计算机视觉程序,首先需要了解 OpenCV 的数据结构。 OpenCV 定义了图像处理中常用的数据结构,如: 1. 基本数据...
opencv学习程序大集合
opencv自带的程序E:\program files\opencv\data\haarcascades下的 全拷到和C++程序同目录下子再运行 #include "stdafx.h" #include "opencv2/objdetect/objdetect...
OpenCV2学习笔记
(2) Matkernel = (Mat_<float>(3,3) << 0, -1.0, 0.0, -1.0, 5.0, -1.0, 0,-1.0, 0); //opencv 中简单初始化只有几个像素的 mat ...
更多相关标签:
opencv官网 | opencv下载 | opencv教程 | opencv中文论坛 | opencv python | 学习opencv | opencv3.0 | opencv安装 |