Python 中的雙邊過濾
過濾用於處理計算機視覺應用程式中的影象。本文將討論使用 OpenCV 模組在 Python 中實現雙邊過濾。
什麼是雙邊過濾
雙邊濾波是一種平滑濾波技術。它是一種非線性降噪濾波器,將每個畫素值替換為相鄰畫素的加權平均畫素值。
雙邊濾波也稱為邊緣保留濾波,因為它不會對邊緣上的畫素進行平均。
在 Python 中執行雙邊過濾的步驟
為了執行雙邊過濾,我們主要執行四個任務。
-
我們將影象中的每個畫素替換為其相鄰畫素的加權平均值。
-
每個鄰居的權重由其與當前畫素的距離決定。我們為每個畫素分配一個權重,其中最近的畫素獲得最高的權重,而距離較遠的畫素獲得最低的權重。
為了執行此任務,我們使用空間引數。
-
鄰居的權重也取決於畫素強度的差異。與當前畫素具有相似強度的畫素被分配更多的權重,而具有較大強度差異的畫素被分配較小的權重。
要執行此任務,我們使用範圍引數。
-
通過增加空間引數,可以平滑影象較大的特徵。另一方面,如果增加範圍引數,雙邊濾波的行為就像高斯濾波。
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)
這是對輸入影象進行雙邊濾波後的輸出影象:
在給定的影象中,你可以觀察到輸出影象中條帶的特徵已經模糊。這是因為在建立輸出畫素時會考慮每個畫素的相鄰畫素。
畫素的平均產生模糊效果,並且特徵被模糊。
與高斯濾波相比,雙邊濾波保留了邊緣。因此,在執行平滑操作時,如果你需要保留影象中的邊緣,則始終可以使用雙邊濾波。