一个自适应中值滤波
原理:(采用论文中的一段讲解)
代码函数:
// 自适应中值滤波器
uchar adaptiveMedianFilter(cv::Mat &img, int row, int col, int kernelSize, int maxSize)
{
std::vector<uchar> pixels;
for (int y = -kernelSize / 2;y <= kernelSize / 2;y++)
{
for (int x = -kernelSize / 2;x <= kernelSize / 2;x++)
{
pixels.push_back(img.at<uchar>(row + y, col + x));
}
}
sort(pixels.begin(), pixels.end());
auto min = pixels[0];
auto max = pixels[kernelSize*kernelSize - 1];
auto med = pixels[kernelSize*kernelSize / 2];
auto zxy = img.at<uchar>(row, col);
if (med > min && med < max)
{
// to B
if (zxy > min && zxy < max)
return zxy;
else
return med;
}
else
{
kernelSize += 2;
if (kernelSize <= maxSize)
return adaptiveMedianFilter(img, row, col, kernelSize, maxSize);// 增大窗口尺寸,继续A过程。
else
return med;
}
}