两种非线性滤波
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
OpenCv下有两种非线性滤波:
中值滤波:MedianBlur
顾名思义就是用与卷积框对应像素的中值来替代中心像素的值。这个滤波器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。他能有效的去除噪声。卷积核的大小也应该是一个奇数。
双边滤波:BilateralFilter
函数 cv2.bilateralFilter() 能在保持边界清晰的情况下有效的去除噪音。但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求中心点临近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考虑一个像素是否位于边界因此边界也会别模糊掉,而这正不是我们想要。双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函数确保只有临近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有与中心像素灰度值相䦀的才会被用来做模糊计算。所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。
两种非线性滤波的执行效果如下:

C#版本代码
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
// 载入原图
Mat image = Cv2.ImRead("../../../images/girl3.jpg");
// 显示原图
Cv2.ImShow("【原图】", image);
//进行中值滤波操作
Mat out1 = new Mat();
Cv2.MedianBlur(image, out1, 7);
//进行双边滤波操作
Mat out2 = new Mat();
Cv2.BilateralFilter(image, out2, 25, 25 * 2, 25 / 2);
//显示效果图
Cv2.ImShow("中值滤波【效果图】", out1);
Cv2.ImShow("双边滤波【效果图】", out2);
Cv2.WaitKey(0);
}
}
}
C++版本代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
// 载入原图
Mat image = imread("../images/girl3.jpg");
// 创建窗口
namedWindow("【原图】");
namedWindow("中值滤波【效果图】");
namedWindow("双边滤波【效果图】");
// 显示原图
imshow("【原图】", image);
//进行中值滤波操作
Mat out1;
medianBlur(image, out1, 7);
//进行双边滤波操作
Mat out2;
bilateralFilter(image, out2, 25, 25 * 2, 25 / 2);
//显示效果图
imshow("中值滤波【效果图】", out1);
imshow("双边滤波【效果图】", out2);
waitKey(0);
return 0;
}
Python版本代码
import cv2
import numpy as np
# 载入原图
image=cv2.imread('../images/girl3.jpg')
# 显示原图
cv2.imshow('image',image)
# 进行中值滤波操作
out1 = cv2.medianBlur(image, 7)
# 进行双边滤波操作
out2 = cv2.bilateralFilter(image, 25, 25 * 2, 25 / 2);
# 显示组合结果
cv2.imshow('medianBlur',out1)
cv2.imshow('bilateralFilter',out2)
cv2.waitKey(0)
cv2.destroyAllWindows()