OpenCV 中值濾波器

Salman Mehmood 2022年6月7日
OpenCV 中值濾波器

在這個演示中,我們將瞭解什麼是中值濾波器,並討論 OpenCV 中的兩種中值濾波器。然後我們還將學習如何在這些中值濾波器的幫助下從影象中去除椒鹽噪聲。

藉助 OpenCV 中的中值濾波器從影象中去除椒鹽噪聲

讓我們看看中值濾波器,它非常適合去噪,尤其是椒鹽噪聲。在快速學習中位數之前,我們都知道均值只不過是所有數字的平均值以及人們使用的典型示例。

例如,你住在一個社群,你的房子在 350 000、425 000 之間,等等。你可能有幾個富人住在你的社群,在山上的某個地方,他們的房子價值 220 萬、320 萬,等等

假設你檢視所有這些的平均值並看到 931 500,這讓你感到驚訝。你可能會認為 931 500 是平均房價;這就是為什麼你總是看房價中位數的原因。

檢視這些值的中位數;它達到 512 500,代表價差好於平均值。這些是你可能在五年級或六年級時學到的統計資料,我們之所以提到這一點是因為我們將在這張圖片中展示它們。

opencv 中值濾波器示例 1

下圖是人工新增了大量椒鹽噪聲,我們可以看到很多暗畫素和亮畫素。如果我們放大,我們可以看到這個應該是均勻灰色的區域。

為什麼會出現這些椒鹽噪聲?由於許多原因,椒鹽噪聲的主要來源就在那裡,尤其是在你用來捕捉影象的舊電子裝置中,其中模數轉換存在一些問題。

opencv 中值濾波器示例 2

高斯模糊還可以,但不能很好地清除這種型別的噪聲,從技術上講,中值濾波器應該做得更好。如果你仔細觀察,所有這些都是均勻的灰色,除了這個顯示為明亮畫素的畫素。

如果我們應用 3x3 核心並檢視中間值,我們正在檢視該中心畫素周圍的所有內容。這個紅色框內所有這些數字的中位數是 140。

如果我們將 255 替換為 140,我們會得到一個非常均勻且均勻的影象。

opencv 中值濾波器示例 3

這是一個快速的圖形化表示,所以讓我們跳入 Python 程式碼。我們將首先從 skimage.filters 匯入 cv2median 來演示在兩個包中使用中值。

我們正在匯入兩張影象,一張用於椒鹽影象並用於調整其大小。我們需要使用 medianBlur() 方法,將影象傳遞給它並將核心大小設定為 3。

import cv2
from skimage.filters import median

SP_IMG = cv2.imread("inp.tif", 0)
IMG = cv2.resize(SP_IMG, (720, 600))

IMG = IMG

Opencv_Median = cv2.medianBlur(IMG, 3)

現在,我們使用相同的術語。skimage 非常相似,只是它定義了你的核心並使用了我們稱為磁碟的東西。

我們需要呼叫 skimage 包中的 median() 方法並傳遞一個影象。我們正在建立磁碟大小,而不是核心大小。

當我們列印磁碟時,它會建立一個矩陣,其中零畫素乘以零,當它在影象頂部移動時,這些畫素乘以 1。

opencv 中值濾波器示例 4

現在,我們傳遞 mode 引數。沒什麼,但是當這個核心到達影象的末尾時,你如何處理結束畫素?

因為它的右邊沒有任何東西,它會新增一些具有恆定值的畫素。

示例程式碼:

from skimage.morphology import disk
import cv2
from skimage.filters import median

SP_IMG = cv2.imread("inp.tif", 0)
IMG = cv2.resize(SP_IMG, (720, 600))

IMG = IMG

Opencv_Median = cv2.medianBlur(IMG, 3)


print(disk(3))

SK_Median = median(IMG, disk(3), mode="constant", cval=0.0)

cv2.imshow("Original", IMG)
cv2.imshow("cv2 median", Opencv_Median)
cv2.imshow("Using skimage median", SK_Median)

cv2.waitKey(0)
cv2.destroyAllWindows()

我們有三個輸出,一個是帶有一些高斯噪聲的原始影象。

opencv 中值濾波器輸出 1

第二個輸出是使用 OpenCV 的中值影象。在此輸出中,結果優於原始影象。

opencv 中值濾波器輸出 2

如果我們使用 skimage 中值檢視下一個輸出,它看起來非常乾淨,背景中沒有任何內容。

opencv 中值濾波器輸出 3

我們可以觀察到 skimage 中位數看起來甚至比 OpenCV 中位數更好,因為這個中位數的核心大小有點小,並且與原始影象相比不是很乾淨。為什麼 skimage 和 OpenCV 中值輸出影象看起來不一樣?

skimage 中值中,我們定義了磁碟大小,在 OpenCV 中值中,我們定義了核心大小。

核心大小不同;因此,輸出看起來略有不同。如果你獲得相同的核心大小,數學將是相同的。

作者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

相關文章 - Python OpenCV