-------------------开通头条号--------------------

实验名称

图像去噪

实验目的

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* InverseHarmonicMeanFilter(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图像去噪的更多相关文章

  1. 基于OpenCV的火焰检测(一)——图像预处理

    博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...

  2. 基于 opencv 的图像处理入门教程

    前言 虽然计算机视觉领域目前基本是以深度学习算法为主,但实际上很多时候对图片的很多处理方法,并不需要采用深度学习的网络模型,采用目前成熟的图像处理库即可实现,比如 OpenCV 和 PIL ,对图片进 ...

  3. [转载]卡尔曼滤波器及其基于opencv的实现

    卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...

  4. 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  5. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  6. 基于opencv网络摄像头在ubuntu下的视频获取

     基于opencv网络摄像头在ubuntu下的视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译运行步骤 安装编译opencv-2.3  参 ...

  7. 基于opencv的小波变换

    基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...

  8. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  9. OpenCV2学习笔记(十四):基于OpenCV卡通图片处理

    得知OpenCV有一段时间.除了研究的各种算法的内容.除了从备用,据导游书籍和资料,尝试结合链接的图像处理算法和日常生活,第一桌面上(随着摄像头)完成了一系列的视频流处理功能.开发平台Qt5.3.2+ ...

随机推荐

  1. Multiple webcams on ZoneMinder

    Monitoring a 3D Printer I have tidied my new workshop and I am starting to play with 3d-printing aga ...

  2. (Nginx + Gunicorn) 时 nginx 400 request line is too large (4360 4094)

    查看nginx下面两个参数 值是否满足 client_header_buffer_size 512k;large_client_header_buffers 4 512k; 满足依然出现 如果ngin ...

  3. 在Asterisk CLI里面采用originate发起一个呼叫

    Asterisk cli下面可以执行很多命令,originate的用途是发起一个呼叫然后连接到指定的应用或上下文. 跟.call呼叫文件和AMI管理接口里的外呼功能一样,有两种语法格式: 呼叫成功转应 ...

  4. AtCoder AGC #4 Virtual Participation

    我好懒啊QAQ 老规矩 从C开始 C.给一个矩阵,里面有一些紫色方块,你需要涂两个矩阵,一个红色,一个蓝色,保证你涂的颜色四连通 然后把红色蓝色矩阵叠起来要求紫色的地方必须是紫色,其他地方不能是紫色 ...

  5. BZOJ_4987_Tree_树形DP

    BZOJ_4987_Tree_树形DP Description 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. Input 第一 ...

  6. Excel 2007无法打开多个窗口的问题

    Excel 2007使用的时候打开多个工作薄的时候,不像2003那样默认独立分开窗口显示.要切换工作簿,需要通过 “视图-切换窗口”来选择需要当前活动的窗口,这样的操作给同时操作多个工作薄来说,非常不 ...

  7. docker 学习(七) docker 容器挂载

    1:docker的默认存放位置: $ sudo su # cd /var/lib/docker # ls -F containers/ graph/ repositories volumes/     ...

  8. 梯度算子(普通的+Robert + sobel + Laplace)

    1.水平垂直差分法: 2.Robert 算子梯度 3.sobel算子 4.拉普拉斯算子

  9. 微信小程序开发之tab导航栏

    实现功能: 点击不同的tab导航,筛选数据 UI:   js: data:{ navbar: ['半月维保', '季度维保', '半年维保',"年度维保"],    //count ...

  10. 9. 那些强悍的PHP一句话后门

    强悍的PHP一句话后门 这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的.今天我们细数一些有意思的PHP一句话木马. 利用4 ...