2 中值滤波
本文作者:图像与视觉InSight 行者 杨尚朋 转载请注明
目录
2.1 处理效果展示
图像处理前后对比1
图1 原图
图2 椒盐噪声处理图
图3 对椒盐噪声图像用中值滤波处理
图像处理前后对比2
图4 原图
图5 用椒盐噪声处理后的图像
图6 对椒盐噪声图像用中值滤波处理
2.2 中值滤波原理
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中位值。
中值滤波,是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术。中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中位值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
中值滤波是用某种结构的二维滑动模板,将模版内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3×3,5×5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
2.3 代码展示
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgcodecs\imgcodecs.hpp>
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<iomanip>
using namespace cv;
using namespace std;
void salt( Mat image, int n);
void pepper( Mat image, int n);
int main()
{
Mat image = imread("C:\\Users\\SYYSP\\Desktop\\BLOG\\滤波专题\\中值滤波\\tiaoqilai.jpg");//原图
imshow("原图", image);
salt(image, 3000);//加入盐噪声255
pepper(image, 3000);//加入椒噪声0
imshow("椒盐噪声", image);//椒盐噪声图片
imwrite("C:\\Users\\SYYSP\\Desktop\\BLOG\\滤波专题\\中值滤波\\tiaoqilai_jiaoyanzaosheng.jpg", image);
//中值滤波
medianBlur(image,image,3);//孔径的线性尺寸,必须是奇数
imshow("中值滤波",image);//中值滤波图片
imwrite("C:\\Users\\SYYSP\\Desktop\\BLOG\\滤波专题\\中值滤波\\tiaoqilai_result.jpg",image);
waitKey(0);
return 0;
}
void salt(Mat image, int n) {
int i, j;
for (int k = 0; k < n / 2; k++) {
i = rand() % image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
j = rand() % image.rows;
if (image.type() == CV_8UC1) { // gray-level image
image.at<uchar>(j, i) = 255; //at方法需要指定Mat变量返回值类型,如uchar等
}
else if (image.type() == CV_8UC3) { // color image
image.at<Vec3b>(j, i)[0] = 255; // Vec3b为opencv定义的一个3个值的向量类型
image.at<Vec3b>(j, i)[1] = 255; //[]指定通道,B:0,G:1,R:2
image.at<Vec3b>(j, i)[2] = 255;
}
}
}
void pepper( Mat image, int n) {
int i, j;
for (int k = 0; k < n; k++) {
// rand() is the random number generator
i = rand() % image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
j = rand() % image.rows;
if (image.type() == CV_8UC1) { // gray-level image
image.at<uchar>(j, i) = 0; //at方法需要指定Mat变量返回值类型,如uchar等
}
else if (image.type() == CV_8UC3) { // color image
image.at<Vec3b>(j, i)[0] = 0; // Vec3b为opencv定义的一个3个值的向量类型
image.at<Vec3b>(j, i)[1] = 0; //[]指定通道,B:0,G:1,R:2
image.at<Vec3b>(j, i)[2] = 0;
}
}
}