圖像處理之雙邊濾波

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.可視化


圖像處理之雙邊濾波


圖像處理之雙邊濾波



分享到:


相關文章: