-
算法原理
——博客:https://blog.youkuaiyun.com/Kena_M/article/details/47093639(可参考)
-
代码:(基于OpenCV框架的C++实现)
#include "opencv2/opencv.hpp"
using namespace cv;
//
// 函数名: MedianBlur
// 参数说明: src,原图
// dst,输出图
// kernel,窗口大小kernel*kernel
// 函数功能: 非线性平滑,消除噪声,较好地保持边缘信息
//
void MedianBlur(const Mat& src, Mat& dst, int kernel);
int main()
{
Mat srcImg = imread("img.bmp", 0);
Mat dstImg;
dstImg = srcImg.clone();
MedianBlur(srcImg, dstImg, 3);
imshow("srcImg: ", srcImg);
imshow("dstImg: ", dstImg);
waitKey(0);
return 0;
}
void MedianBlur(const Mat & src, Mat & dst, int kernel)
{
int i, j;
int nWidth = src.cols, nHeight = src.rows;
int kernel_width = kernel / 2;
const int t = (kernel*kernel + 1) / 2;
int medianValue;//中值
int pixelCountLowerMedian;//小于等于medianValue的像素个数
uchar* data = src.data;
for (i = kernel_width; i < nHeight - kernel_width; i++)
{
int hist[256] = { 0 };
//统计局部直方图
for (int m = 0; m < kernel; m++)
{
for (int n = 0; n < kernel; n++)
{
hist[data[(i + m - kernel_width)*nWidth + n]]++;
}
}
//求局部的中值 和 小于等于中值的像素个数
int sum = 0;
for (int m = 0; m < 256; m++)
{
sum += hist[m];
if (2 * sum > kernel*kernel)
{
medianValue = m;
pixelCountLowerMedian = sum;
break;
}
}
//右移窗口
for (j = kernel_width + 1; j < nWidth - kernel_width; j++)
{
//更新直方图 和 pixelCountLowerMedian
for (int m = 0;m < kernel; m++)
{
int pixelLeft = data[(i + m - kernel_width)*nWidth + j - kernel_width - 1];
hist[pixelLeft]--;
if (pixelLeft <= medianValue)
pixelCountLowerMedian--;
int pixelRight = data[(i + m - kernel_width)*nWidth + j + kernel_width];
hist[pixelRight]++;
if (pixelRight <= medianValue)
pixelCountLowerMedian++;
}
//更新pixelCountLowerMedian 和 medianValue
if (pixelCountLowerMedian == t)
{
}
else if (pixelCountLowerMedian > t)
{
do
{
if (medianValue == 0)
break;
pixelCountLowerMedian -= hist[medianValue];
medianValue--;
} while (pixelCountLowerMedian > t);
}
else
{
do
{
if (medianValue == 255)
break;
medianValue++;
pixelCountLowerMedian += hist[medianValue];
} while (pixelCountLowerMedian < t);
}
dst.data[i*nWidth + j] = medianValue;
}
}
}
-
结果显示


-
总结分析