参考:桑卡,《图像处理分析与机器学习》
中值滤波每次都需要对kernel内的像素进行排序,效率较低。kernel每次向右移动时,最左一列消失,同时增加最右一列,所以可以对kernel内的像素建立一个直方图,计算median value以及小于等于median value的像素个数nm。kernel每次更新时,重新计算median value和nm。算法如下:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <cmath>
using namespace cv;
using namespace std;
void MyEfficientMedianFiltering(Mat& src, Mat& dst, int ksize);
int main( int argc, char** argv )
{
// load image
char* imageName = "images/Lenna_noise.jpg";
Mat image;
image = imread(imageName,1);
if(!image.data)
{
cout