图像去噪的OPenCV添加噪声和去噪
2016-07-18 09:26
381 查看
添加噪声
添加高斯噪声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(25)); cvAdd(src,noise,dst); return dst; }
添加椒盐噪声
IplImage* AddPepperSaltNoise(IplImage* src) //添加椒盐噪声,随机黑白点 { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvCopy(src, dst); for(int k=0; k<(src->height*src->width*P); 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; }
实现滤波器
1、 算术均值滤波器//算术均值滤波器——模板大小5*5 IplImage* ArithmeticMeanFilter(IplImage* src) { IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); cvSmooth(src,dst,CV_BLUR,5); return dst; }
2、 几何均值滤波器
//几何均值滤波器——模板大小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; }
3、谐波均值滤波器
//谐波均值滤波器——模板大小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; }
4、逆谐波均值滤波器
//逆谐波均值大小滤波器——模板大小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; }
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- Python中使用OpenCV库来进行简单的气象学遥感影像计算
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python环境搭建之OpenCV的步骤方法
- Python+Opencv识别两张相似图片
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- 使用 Java 开发 OpenCV 应用
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- visual studio 2012安装配置方法图文教程 附opencv配置教程