一、编程环境:
OpenCV | 4.1.0 |
IDE | Visual Studio 2017 Enterprise (15.9.13) |
操作系统 | Windows 10 x64 中文专业版 (1903) |
二、图像高斯双边模糊:
前面我们介绍的图像卷积处理无论是均值还是高斯都是属于模糊卷积,它们都有一个共同的特点就是模糊之后图像的边缘信息不复存在,受到了破坏。
边缘保留滤波算法(EPF)有能力通过卷积处理实现图像模糊的同时对图像边缘不会造成破坏,滤波之后的输出完整的保存了图像整体边缘(轮廓)信息。
最常见的边缘保留滤波算法有以下几种:
- 高斯双边模糊
- Meanshift均值迁移模糊
- 局部均方差模糊
高斯模糊是考虑图像空间位置对权重的影响,但是它没有考虑图像像素分布对图像卷积输出的影响,双边模糊考虑了像素值分布的影响,对像素值空间分布差异较大的进行保留从而完整的保留了图像的边缘信息。
双边模糊可以去除无关噪声,同时保持较好的边缘信息。 但是,其速度比绝大多数滤波器都慢。
三、程序说明:
OpenCV 中双边模糊的函数为:bilateralFilter()
void bilateralFilter( InputArray src, //(原始图像:8-bit或floating-point,1-channel或3-channel)
OutputArray dst, // 目标图像:size和type与原始图像相同
int d, // 过滤期间使用的各像素邻域的直径
double sigmaColor, // 色彩空间的sigma参数,该参数较大时,各像素邻域内相距较远的颜色会被混合到一起,从而造成更大范围的半相等颜色
double sigmaSpace, // 坐标空间的sigma参数,该参数较大时,只要颜色相近,越远的像素会相互影响
int borderType = BORDER_DEFAULT // 边界类型:指定如何确定图像范围外的像素的取值(在处理边缘像素时)
);
- 关于2个sigma参数
简单起见,可以令2个sigma的值相等;
如果他们很小(小于10),那么滤波器几乎没有什么效果;
如果他们很大(大于150),那么滤波器的效果会很强,使图像显得非常卡通化;
- 关于参数d
过大的滤波器(d>5)执行效率低。
对于实时应用,建议取 d=5;
对于需要过滤严重噪声的离线应用,可取 d=9;
d>0 时,由 d 指定邻域直径;
d<=0 时,d 会自动由 sigmaSpace 的值确定,且 d 与 sigmaSpace 成正比。
四、示例程序:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("../images/test.jpg");
if (src.empty()) {
printf("不能打开图像!\n");
return -1;
}
namedWindow("1--原图", WINDOW_AUTOSIZE);
imshow("1--原图", src);
Mat dst;
//双边模糊
bilateralFilter(src, dst, 0, 100, 15, 4);
imshow("2--bilateralFilter", dst);
waitKey(0);
return 0;
}
五、运行效果:
经过实际测试,这个算法对消除图像中的水印比较有效。