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

实验名称

图像去噪

实验目的

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。

实验代码参照问题一,选择彩色图片、算术均值滤波器和几何均值滤波器进行彩色图像去噪。

实验结果如下图(以椒盐噪声为例):

利用算术均值滤波器:

利用几何均值滤波器:

实验中的问题

实验问题:几何均值滤波以及谐波、逆谐波滤波没有对应的库函数

解决方法:通过学习书本对应章节,根据公式写出程序

实验结果

转载于:https://www.cnblogs.com/zhangfeionline/p/5427376.html

基于 opencv图像去噪相关推荐

  1. opencv 处理黑夜_基于 opencv图像去噪

    1. 实验步骤:先为灰度图像添加高斯噪声.胡椒噪声.盐噪声和椒盐噪声,再分别利用算术均值滤波器.几何均值滤波器.谐波和逆谐波均值滤波器进行图像去噪.模板大小为5*5. 核心代码如下: 添加各类噪声: ...

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

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 146 篇文章,本文大约 5000 字,阅读大约需要 20 分钟 前言 ...

  3. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  4. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  5. 《OpenCV3编程入门》学习笔记7 图像变换(一)基于OpenCV的边缘检测

    第7章 图像变换 7.1 基于OpenCV的边缘检测 7.1.1 边缘检测的一般步骤 1.滤波:边缘检测算法主要基于图像强度的一阶和二阶导数,导数对噪声敏感,所以要滤波 2.增强:确定图像各点邻域强度 ...

  6. 基于OpenCV的图像梯度与边缘检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 严格的说,梯度计 ...

  7. 基于OpenCV的图像分割处理!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 图像阈值化分割是 ...

  8. 基于Opencv实现眼睛控制鼠标

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方 ...

  9. 基于OpenCV的数字识别系统

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 综述 2012年iOS应用商店中发布了一个名为FuelMate的G ...

最新文章

  1. hadoop,spark,scala,flink 大数据分布式系统汇总
  2. 写 Python 代码不可不知的函数式编程技术
  3. 「打造中国人自己的开放 AI」:清华教授唐杰宣布成立AI新期刊
  4. BrainNet:脑-脑接口用于人与人之间直接协作
  5. 石川es6课程---13-16、generator-认识生成器函数
  6. QT的QWinThumbnailToolBar类的使用
  7. 【转】1.3异步编程:线程同步基元对象
  8. php+正则匹配qq,正则表达式对qq号进行验证的实例
  9. python 音速_中国大学MOOC的APP(慕课)2021用Python玩转数据章节答案
  10. SpringMVC实现RESTful风格
  11. 计算机专业排版有哪些,计算机专业英语词汇(完美排版_大容量打印版).pdf
  12. Linux系统简介与准备
  13. 孤独的周鸿祎,落寞的 360
  14. 28. Avoid returning handles to object internals
  15. Android MTK 6763 User 版本默认打开usb调试
  16. 2018Web前端面试题及答案大全
  17. 胡海牙和李兆生的仙逝有感
  18. 程序员不要和陌生人说话——漫谈一些有趣的架构原则
  19. C# AO/ArcEngine 栅格数据总结
  20. C++ 探索之旅 | 第一部分第二课:C++ 编程的必要软件

热门文章

  1. JQueryDOM之插入节点
  2. 神经网络测试集loss不变_神经网络训练过程中不收敛或者训练失败的原因
  3. 未来网闸的发展趋势(实际应用需求,解决方案)
  4. Mysql用户权限管理:Grank和Revoke
  5. python源码 高通滤波、低通滤波、带通滤波
  6. python神经网络案例——CNN卷积神经网络实现mnist手写体识别
  7. 在docker上和ubuntu上运行InfoGAN
  8. Ubuntu用ssh连接虚拟机
  9. 汇编画图题:存储器扩展(重要)
  10. 8255工作方式2——双向选通输入输出(A口)