OpenCV medianBlur、GaussianBlur和bilateralFilter (中值滤波、高斯滤波、双边滤波)

::返回OpenCV算子速查表

1. 函数定义

1.1 中值模糊

OpenCV官方文档

	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 高斯模糊

OpenCV官方文档

	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 双边滤波

OpenCV官方文档

	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 的值: 为了方便起见,你可以把sigmaColorsigmaSpace 设置为相等;如果它们小于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;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值