::返回OpenCV算子速查表
中值模糊、高斯模糊和双边滤波
- 1. 函数定义
- 1.1 中值模糊
- 1.2 高斯模糊
- 1.3 双边滤波
- 2. 例程
1. 函数定义
1.1 中值模糊
void medianBlur(
InputArray src,
OutputArray dst,
int ksize
);
- 支持就地调用(源图像和目标图像是同一幅图像);
- 输入可以为1、3或4通道图像;
- 当ksize为3或5时,图像深度可以为CV_8U、CV_16U或CV_32F;
- 但是当ksize大于5时,图像的深度就只能为CV_8U。
1.2 高斯模糊
void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
);
- 支持就地调用
- 输入可以有任意数量的通道图像,这些通道是独立处理的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。
- ksize是高斯核的尺寸,ksize.width 和ksize.height 可以不相同,但必须是正的奇数;或者你把它们设置为0,它们的实际数值会根据sigma的值而被自动计算出来。
- sigmaX X方向上的高斯核标准差。
- sigmaY Y方向高斯核标准差,如果sigmaY是0,它会被设置为等于sigmaX,如果两个sigmaX和sigmaY都是0,它们会根据ksize计算出来。OpenCV建议指定所有ksize、sigmaX和sigmaY。
1.3 双边滤波
void bilateralFilter(
InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
);
- 不支持就地调用
- bilateralFilter可以很好地减少不必要的噪声,同时保持边缘清晰。但是,与大多数滤波器相比,它运行效率很低。
- d 的值:d大于5时,效率就开始变得低下了,所以如果你需要实时应用双边滤波器,那么d的值不要超过5,如果你需要离线处理噪声很严重的图像,就可以把d设置的更大一些了;
- d的值如果是非正数,它将会由sigmaSpace来计算。
- Sigma 的值: 为了方便起见,你可以把sigmaColor 和 sigmaSpace 设置为相等;如果它们小于10,滤波器可能都不起什么作用,但是如果它们大于150,滤波器的作用可能又太大了,图片会变成卡通片似的。
- sigmaColor:颜色空间的sigma值,值越大,意味着颜色差异更大的临近像素会被融合到一起去。会导致更大的semi-equal color区域。这里是在OpenCV官方文档里看到的,没有想明白semi-equal color应该怎么翻译和理解,有知道的朋友可以告诉我。
- sigmaSpace:坐标系空间的sigma值,值越大,意味着距离更远的像素将会互相影响(只要它们的颜色足够接近)。当d>0, 就由d来指定邻域大小,sigmaSpace就没用了,如果d≤0时, d的实际值会与 sigmaSpace成正比。
2. 例程
- 中值模糊和高斯模糊都能够很有效的去除椒盐噪声,但是如同它们的名字“模糊”,图像也变得模糊了。双边滤波虽然可以保持图像的边缘细节,但是无法很好地去除椒盐噪声。如果先使用模糊,再使用双边滤波,这样的处理结果或许是一个折中的办法。
#include "stdafx.h"
#include <opencv.hpp>
using namespace cv;
//中值模糊,高斯模糊,双边滤波
int main()
{
Mat m_SrcImg = imread("./椒盐噪声美女.jpg");
imshow("原图", m_SrcImg);
Mat m_DstImg;
medianBlur(m_SrcImg, m_DstImg, 5);
imshow("中值模糊", m_DstImg);
//要注意高斯模糊的高斯核尺寸应该是正的奇数
GaussianBlur(m_SrcImg, m_DstImg, Size(5,5), 10, 10);
imshow("高斯模糊", m_DstImg);
bilateralFilter(m_SrcImg, m_DstImg, 15, 100, 100);
imshow("双边滤波", m_DstImg);
medianBlur(m_SrcImg, m_DstImg, 3);
//这里要尤其注意,双边滤波不支持就地调用
Mat m_DstImg2;
bilateralFilter(m_DstImg, m_DstImg2, 15, 100, 100);
imshow("中值模糊+双边滤波", m_DstImg2);
GaussianBlur(m_SrcImg, m_DstImg, Size(3, 3), 10, 10);
bilateralFilter(m_DstImg, m_DstImg2, 15, 100, 100);
imshow("高斯模糊+双边滤波", m_DstImg2);
waitKey(0);
return 0;
}