图像处理之双边滤波

1.认识双边滤波

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

双边滤波器是保留边界的平滑滤波器。 在局部上,就是在灰度值差异不大的区域平滑,在灰度值差异比较大的边界地区保留边界。所以双边滤波器作用于每个像素的同时,必然会受到领域像素点的距离、灰度值差的权重影响。


图像处理之双边滤波

1.1应用

图像中空间变化较小,因此边缘被线性低通滤波所模糊。如何在保持平滑区域内平均的同时,防止边沿平均? 为了减少这种不良影响,我们采用双边滤波器。双边滤波是一种用于边缘保留平滑的简单,而非迭代方案。

1.2优势

如上图所示,由于滤波器的域分量,在边界处实现了良好的滤波行为,并且由于范围分量,同时保留了清晰的边缘。

2.OpenCV函数示例

<code>void bilateralFilter( InputArray src, OutputArray dst, int d,
double sigmaColor, double sigmaSpace,
int borderType = BORDER_DEFAULT );/<code>

参数解释:

  • src:源图像Mat对象,需要为8位或者浮点型单通道、三通道的图像dst:目标图像Mat对象,不能直接用src来存储处理后的图像
  • d:表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来,在使用过程中我发现有点像模糊力度的意思。
  • sigmaColor:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。在使用过程中我发现有点像模糊范围的意思,范围越大看着越模糊
  • sigmaSpace:坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。使用过程中我发现这个值越大,图像的过渡效果越好。
  • borderType:使用默认即可,即不用填。

3.C++实现

<code>//--------------------------------------【程序说明】-------------------------------------------
//\t\t程序描述:双边滤波bilateralFilter函数的使用示例程序
//\t\t开发测试所用操作系统: Windows 10 64bit
//\t\t开发测试所用IDE版本:Visual Studio 2017
//\t\t开发测试所用OpenCV版本:\t3.4
//\t\t2020年3月 Created by @DL小宝
//\t\t2020年3月 Revised by @DL小宝
//------------------------------------------------------------------------------------------------

//-----------------------------------【头文件包含部分】---------------------------------------
//\t描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

//-----------------------------------【命名空间声明部分】---------------------------------------
//\t描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace cv;

//-----------------------------------【main( )函数】--------------------------------------------
//\t描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{
\t// 载入原图
\tMat image = imread("bmm.jpg");
\t//创建窗口
\tnamedWindow("双边滤波【原图】");
\tnamedWindow("双边滤波【效果图】");
\t//显示原图
\timshow("双边滤波【原图】", image);
\t//进行双边滤波操作
\tMat out;
\tbilateralFilter(image, out, 25, 25 * 2, 25 / 2);

\t//显示效果图
\timshow("双边滤波【效果图】", out);
\twaitKey(0);
}/<code>

4.可视化


图像处理之双边滤波


图像处理之双边滤波



分享到:


相關文章: