中值滤波就是用滤波器范围内所有像素值的中值来替代滤波器中心位置像素值的滤波方法,是一种基于排序统计理论的能够有效抑制噪声的非线性信号处理方法。
中值滤波不依赖于滤波器内那些与典型值差别很大的值,因此对斑点噪声和椒盐噪声的处理具有较好的处理效果。
相比于均值滤波,中值滤波对于脉冲干扰信号和图像扫描噪声的处理效果更佳,同时在一定条件下中值滤波对图像的边缘信息保护效果更佳,可以避免图像细节的模糊,但是当中值滤波尺寸变大之后同样会产生图像模糊的效果。在处理时间上,中值滤波所消耗的时间要远大于均值滤波消耗的时间。
中值相对于均值 对异常数据不敏感 不会因为异常数据产生影响
void medianBlur( InputArray src, OutputArray dst, int ksize );
- src:待中值滤波的图像,可以是单通道,三通道和四通道,数据类型与滤波器的尺寸相关,当滤波器尺寸为3或5时,图像可以是CV_8U,CV_16U或CV_32F类型,对于较大尺寸的滤波器,数据类型只能是CV_8U。
- dst:输出图像,与输入图像src具有相同的尺寸和数据类型。
- ksize:滤波器尺寸,必须是大于1的奇数,例如:3、5、7……
简单示例
//
// Created by smallflyfly on 2021/6/15.
//
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat im = imread("test.jpg");
resize(im, im, Size(0, 0), 0.5, 0.5);
Mat im3, im9;
medianBlur(im, im3, 3);
medianBlur(im, im9, 9);
// gaussNoise
Mat gaussNoise = Mat::zeros(im.rows, im.cols, im.type());
RNG rng;
rng.fill(gaussNoise, RNG::NORMAL, 10, 20);
Mat imGauss = im + gaussNoise;
medianBlur(imGauss, imGauss, 3);
imshow("im3", im3);
imshow("im9", im9);
imshow("imGauss", imGauss);
waitKey(0);
destroyAllWindows();
return 0;
}