实验内容及实验原理:

1.用均值滤波器(即邻域平均法)去除图像中的噪声;

2.用中值滤波器去除图像中的噪声

3.比较两种方法的处理结果

实验步骤:

用原始图像lena.bmp或cameraman.bmp加产生的3%椒盐噪声图像合成一幅有噪声的图像并显示;

1.用均值滤波器去除图像中的噪声(选3x3窗口):以当前像素点为中心,求窗口内所有灰度值的和,以其平均值作为中心像素新的灰度值

2. 用中值滤波器去除图像中的噪声(选3x3窗口做中值滤波);以当前像素点为中心,求窗口中所有像素点的灰度值的中值,以中值作为中心像素点的值

3.将两种处理方法的结果与原图比较,注意两种处理方法对边缘的影响。

添加椒盐噪声

以3%的几率产生随机为0/255的灰度值覆盖原来的灰度值

   for (int i = 0; i <src->height; i++){
for (int j = 0; j <src->width; j++){
CvScalar s = cvGet2D(src, i,j);
srand(seed++);
if (rand() % 100 <3){//3%的几率覆盖
srand(seed++);
s.val[0]= rand() % 2 * 255;//随机是0还是255
}
cvSet2D(dst,i, j, s);
}
}

添加后:

均值滤波

计算当前像素周围的九个像素点的灰度值和,以其平均值作为当前像素的灰度值。如果是边缘的像素点就求有限的几个像素灰度值的平均值

for (int i = 0;i < dst->height; i++){
for (int j = 0; j < dst->width; j++){
CvScalar s =cvGet2D(dst, i, j);
double sum =0;//存放窗口中所有像素点灰度值的和
int num =0;//记录窗口中像素的个数,因为边界上可能不是9个像素
//求3x3的和
for (int k = -1; k <= 1; k++)
for (int m = -1; m <= 1; m++)
if (i + k>= 0 && i + k <= 255 && j + m >= 0 && j + m<= 255){
CvScalar temp =cvGet2D(dst, i+k, j+m);
sum += temp.val[0];
num++;
}
s.val[0] = sum/num;
cvSet2D(dst_sp, i, j, s);
}
}

中值滤波

获取当前像素位置周围的九个像素灰度值,排序选择中间值作为新的灰度值。如果是边界的像素点就只选择有限的几个灰度值的中值

for (int i = 0;i < dst->height; i++){
for (int j = 0; j < dst->width; j++){
CvScalar s =cvGet2D(dst, i, j);
double val[9]= {0},mid=0;//分别为存放窗口中所有灰度值的数组和中值
int num =0;//记录实际窗口中有几个像素点
         //遍历当前像素点为中心的3X3窗口
for (int k = -1; k <= 1; k++)
for (int m = -1; m <= 1; m++)
if (i + k>= 0 && i + k <= 255 && j + m >= 0 && j + m<= 255){//在图像上,没有超出边界
CvScalar temp =cvGet2D(dst, i + k, j + m);
val[num++]= temp.val[0];
}
//冒泡排序,从大到小
for (int k = 0; k < 9; k++){
for (int m = 0; m < 8-k; m++){
if (val[m]< val[m + 1]){
double temp =val[m];
val[m] = val[m + 1];
val[m + 1] = temp;
}
}
}
s.val[0] = val[num/2];//求中值
cvSet2D(dst_sp2, i, j, s);
}
}

源码:

// opencv1.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <cxcore.h>
#include <cvaux.h>
#include <stdlib.h>
#include <imgproc.hpp>
#include <time.h> using namespace cv; int main()
{
IplImage *src;
src = cvLoadImage("lena.bmp", 1);//原图
IplImage *dst = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_8U, 1); std::cout << "添加椒盐噪声" << std::endl;
int seed = 1;
for (int i = 0; i < src->height; i++)
{
for (int j = 0; j < src->width; j++)
{
CvScalar s = cvGet2D(src, i, j);
srand(seed++);
if (rand() % 100 < 3)
{
srand(seed++);
s.val[0] = rand() % 2 * 255;
}
cvSet2D(dst, i, j, s);
}
}
cvNamedWindow("Image1", 1);//创建窗口
cvShowImage("Image1", dst);//显示图像 IplImage *dst_sp = cvCreateImage(cvSize(dst->width, dst->height), IPL_DEPTH_8U, 1);
std::cout << "均值滤波" << std::endl;
for (int i = 0; i < dst->height; i++)
{
for (int j = 0; j < dst->width; j++)
{
CvScalar s = cvGet2D(dst, i, j);
double sum = 0;
int num = 0;
//求3x3的和
for (int k = -1; k <= 1; k++)
for (int m = -1; m <= 1; m++)
if (i + k >= 0 && i + k <= 255 && j + m >= 0 && j + m <= 255)
{
CvScalar temp = cvGet2D(dst, i+k, j+m);
sum += temp.val[0];
num++;
} s.val[0] = sum/num;
cvSet2D(dst_sp, i, j, s);
}
}
cvNamedWindow("Image2", 1);//创建窗口
cvShowImage("Image2", dst_sp);//显示图像 IplImage *dst_sp2 = cvCreateImage(cvSize(dst->width, dst->height), IPL_DEPTH_8U, 1);
std::cout << "中值滤波" << std::endl;
for (int i = 0; i < dst->height; i++)
{
for (int j = 0; j < dst->width; j++)
{
CvScalar s = cvGet2D(dst, i, j);
double val[9] = {0},mid=0;
int num = 0;
for (int k = -1; k <= 1; k++)
for (int m = -1; m <= 1; m++)
if (i + k >= 0 && i + k <= 255 && j + m >= 0 && j + m <= 255)
{
CvScalar temp = cvGet2D(dst, i + k, j + m);
val[num++]= temp.val[0];
}
//排序,从大到小
for (int k = 0; k < 9; k++)
{
for (int m = 0; m < 8-k; m++)
{
if (val[m] < val[m + 1])
{
double temp = val[m];
val[m] = val[m + 1];
val[m + 1] = temp;
}
}
}
s.val[0] = val[num/2];
cvSet2D(dst_sp2, i, j, s);
}
}
cvNamedWindow("Image3", 1);//创建窗口
cvShowImage("Image3", dst_sp2);//显示图像
cvWaitKey(0); //等待按键
cvReleaseImage(&dst_sp2); //释放图像
cvReleaseImage(&dst_sp); //释放图像 cvReleaseImage(&dst); //释放图像
}

原图:(原来是bmp格式的,但是不能上传,改成png格式了,分辨率都是256X256的)

opencv——均值/中值滤波器去噪的更多相关文章

  1. Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析

    meanShfit均值漂移算法是一种通用的聚类算法,它的基本原理是:对于给定的一定数量样本,任选其中一个样本,以该样本为中心点划定一个圆形区域,求取该圆形区域内样本的质心,即密度最大处的点,再以该点为 ...

  2. Java Opencv 实现 中值滤波器

    原理 Note 以下原理来源于Richard Szeliski 的著作 Computer Vision: Algorithms and Applications 以及 Learning OpenCV ...

  3. CV_图像滤波[转]---python+opencv均值滤波,高斯滤波,中值滤波,双边滤波

    1.图像滤波算法(cv2) https://blog.csdn.net/qq_27261889/article/details/80822270 2.

  4. Python+OpenCV图像处理(七)—— 滤波与模糊操作

    过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...

  5. opencv知识积累

    1.OpenCV 3计算机视觉:Python语言实现 https://github.com/techfort/pycv 2.OpenCV3编程入门 opencv 均值模糊:一般用来处理图像的随机噪声 ...

  6. Photoshop中磁力套索的一种简陋实现(基于Python)

    经常用Photoshop的人应该熟悉磁力套索(Magnetic Lasso)这个功能,就是人为引导下的抠图辅助工具.在研发领域一般不这么叫,通常管这种边缘提取的办法叫Intelligent Sciss ...

  7. 数字图像去噪典型算法及matlab实现

    原文地址http://jncumter.blog.51cto.com/812546/243961   图像去噪是数字图像处理中的重要环节和步骤.去噪效果的好坏直接影响到后续的图像处理工作如图像分割.边 ...

  8. [Object Tracking] MeanShift

    使用Opencv中均值漂移meanShift跟踪移动目标 Opencv均值漂移pyrMeanShiftFiltering彩色图像分割流程剖析 Opencv目标跟踪—CamShift算法 MeanShi ...

  9. OpenCV---边缘保留滤波EPF

    OpenCV经典的两种实现EPF方法:高斯双边和均值迁移 一:双边模糊 差异越大,越会完整保留 def bi_demo(image): dst = cv.bilateralFilter(image,0 ...

随机推荐

  1. Ajax :六个全局事件

    加载请求: .ajaxStart() 和 .ajaxstop() $(document).ajaxStart(function(){ $('.loading').show(); }).ajaxStop ...

  2. hiho169周 - 表达式求值

    题目链接 计算表达式100*(2+12)-(20/3)*2 ---------------------------------------------------------------------- ...

  3. 数字游戏(string的sort的应用)

    题目描述 牛牛举办了一场数字游戏,有n个玩家参加这个游戏,游戏开始每个玩家选定一个数,然后将这个数写在纸上(十进制数,无前缀零),然后接下来对于每一个数字将其数位按照非递减顺序排列,得到新的数,新数的 ...

  4. vue 锚点定位

    vue 锚点定位 <template> <div class="details"> <div class="wrapper w"& ...

  5. jQuery基本操作以及与js的一些比较

    jQuery和js主要区别在DOM操作 用jQuery必须先引进jQuery.js文件 js和jQuery写在哪: 1.标签里面 常用就是方法调用 2.写在script标签里面 3.js文件 dom操 ...

  6. 关于PY的推导式

    列表推导式: In [26]: [i*2 for i in range(10)] Out[26]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 字典推导式: In [29] ...

  7. (2016北京集训十)【xsy1530】小Q与内存

    一道很有意思的神题~ 暴力平衡树的复杂度很对(并不),但是$2^{30}$的空间一脸屎 这题的正解是一个类似线段树的数据结构,我觉得很有创新性Orz 首先可以想到一种暴力就是用一个点代表一个区间,然后 ...

  8. bzoj2333 [SCOI2011]棘手的操作(洛谷3273)

    题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作:U x y: 加一条边,连接第x个节点和第y个节点A1 x v: 将第x个节点的权 ...

  9. jquery 取页面中ifram中得节点

    <iframe src="html/bai.jsp" frameBorder=0 id=middle name=middle scrolling="yes" ...

  10. 计数排序(counting-sort)

    计数排序是一种稳定的排序算法,它不是比较排序.计数排序是有条件限制的:排序的数必须是n个0到k的数,所以计数排序不适合给字母排序.计数排序时间复杂度:O(n+k),空间复杂度:O(k),当k=n时,时 ...