Python 中的雙邊過濾

Aditya Raj 2023年1月30日 2022年6月7日
  1. 什麼是雙邊過濾
  2. 在 Python 中執行雙邊過濾的步驟
  3. Python 中的 bilateralFilter() 函式
  4. 在 Python 中使用 bilateralFilter() 函式執行雙邊過濾
Python 中的雙邊過濾

過濾用於處理計算機視覺應用程式中的影象。本文將討論使用 OpenCV 模組在 Python 中實現雙邊過濾。

什麼是雙邊過濾

雙邊濾波是一種平滑濾波技術。它是一種非線性降噪濾波器,將每個畫素值替換為相鄰畫素的加權平均畫素值。

雙邊濾波也稱為邊緣保留濾波,因為它不會對邊緣上的畫素進行平均。

在 Python 中執行雙邊過濾的步驟

為了執行雙邊過濾,我們主要執行四個任務。

  1. 我們將影象中的每個畫素替換為其相鄰畫素的加權平均值。

  2. 每個鄰居的權重由其與當前畫素的距離決定。我們為每個畫素分配一個權重,其中最近的畫素獲得最高的權重,而距離較遠的畫素獲得最低的權重。

    為了執行此任務,我們使用空間引數。

  3. 鄰居的權重也取決於畫素強度的差異。與當前畫素具有相似強度的畫素被分配更多的權重,而具有較大強度差異的畫素被分配較小的權重。

    要執行此任務,我們使用範圍引數。

  4. 通過增加空間引數,可以平滑影象較大的特徵。另一方面,如果增加範圍引數,雙邊濾波的行為就像高斯濾波。

Python 中的 bilateralFilter() 函式

我們可以使用 OpenCV 模組使用 bilateralFilter() 函式在 Python 中執行雙邊過濾。bilateralFilter() 函式的語法如下。

bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)

這裡,

  • 引數 src 將必須處理的源影象作為輸入引數。

  • 引數 d 採用過濾時要考慮的畫素鄰域的直徑。

  • 引數 sigmaColor 是色彩空間中過濾器 sigma 的值。具有較高的 sigmaColor 值意味著在過濾時考慮顏色空間中相距較遠的顏色。

    引數 sigmaColor 應包含 sigmaSpace 範圍內的值。

  • 引數 sigmaSpace 表示空間域中的 sigma 值。sigmaSpace 的較高值意味著在過濾時考慮距離當前畫素較遠的畫素。

    引數 sigmaSpace 應包含 sigmaColor 範圍內的值。

  • 引數 borderType 用於定義在過濾影象邊界畫素的同時推斷影象外部畫素的模式。

在 Python 中使用 bilateralFilter() 函式執行雙邊過濾

以下是在 Python 中執行雙邊過濾的步驟。

  • 首先,我們將匯入 cv2
  • 接下來,我們將使用 imread() 函式開啟影象,該函式將影象的檔案路徑作為其輸入引數,並返回一個表示影象的陣列。
  • 我們將陣列儲存在變數 img 中。
  • 載入影象後,我們將使用 bilateralFilter() 函式在 Python 中執行雙邊功能。執行後,bilateralFilter() 函式返回一個包含處理後影象的陣列。
  • 獲得處理後的影象後,我們將使用 imwrite() 函式將其儲存到檔案系統,該函式將包含輸出檔案的檔名的字串作為其第一個輸入引數,並將包含已處理影象的陣列作為其第二個輸入爭論。執行該函式後,檔案被儲存到檔案系統中。

下面是我們將用於在 Python 中執行雙邊過濾的影象。

模式

以下是在 Python 中執行雙邊過濾的程式碼。

import cv2

img = cv2.imread("pattern.jpg")
output_image = cv2.bilateralFilter(img, 15, 100, 100)
cv2.imwrite("processed_image.jpg", output_image)

這是對輸入影象進行雙邊濾波後的輸出影象:

雙邊過濾 python 處理的影象

在給定的影象中,你可以觀察到輸出影象中條帶的特徵已經模糊。這是因為在建立輸出畫素時會考慮每個畫素的相鄰畫素。

畫素的平均產生模糊效果,並且特徵被模糊。

與高斯濾波相比,雙邊濾波保留了邊緣。因此,在執行平滑操作時,如果你需要保留影象中的邊緣,則始終可以使用雙邊濾波。