关于medianBlur的介绍,网上有很多很好的文章,本文主要是自己的测试。
中值滤波(Median filter)是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节.
medianBlur采用的不是默认的边缘填充,而是用BORDER_REPLICATE方式进行的填充。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void median(const Mat src,int kSize)
{
Mat temp;
int border = kSize / 2;
copyMakeBorder(src, temp, border, border, border, border, BORDER_REPLICATE);
cout << "原始数据经过BORDER_REPLICATE填充:" << endl;
cout << temp << endl << endl;
Mat median(src.rows, src.cols, CV_8UC1);
for(int i=0;i<temp.rows-2* border;i++)
for (int j = 0; j < temp.cols-2* border;j++)
{
Rect rect(j,i, kSize, kSize);
Mat clip = temp(rect).clone();
sort(clip.data, clip.data+kSize* kSize);
median.at<uchar>(i, j) = clip.data[kSize*kSize/2];
}
cout << "排序取中间值后:" << endl;
cout << median << endl;
}
int main(int argc, char** argv) {
Mat src(4,4,CV_8UC1);
RNG rng;
uchar *data = src.data;
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
*(data++) = rng.operator uchar();
}
}
cout << "原始数据:" << endl;
cout << src << endl << endl;
Mat dst;
medianBlur(src, dst, 3);
cout << "medianBlur处理后的数据:" << endl;
cout << dst << endl << endl;
median(src,3);
imshow("result", src);
waitKey(0);
return 0;
}
程序输出: