更新於 2024/12/02閱讀時間約 7 分鐘

[Python][OpenCV]自適應中值濾波

中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。

後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於標準中值濾波的擴展,並結合了自適應算法的思想。

核心概念

  • 標準中值濾波:對於一個像素,考察它周圍一定窗口內的所有像素值,並以其中的中值取代中心像素值。
  • 自適應中值濾波:動態調整窗口大小,以更好地處理圖像中的雜訊和邊緣,避免過度平滑。

主要特性

  1. 自適應中值濾波根據雜訊密度自適應地調整濾波窗口的大小。
  2. 能夠有效保護圖像的邊緣和細節,同時消除椒鹽雜訊。

窗口大小

標準中值濾波器

  • 窗口大小固定(如 3×33×3)。
  • 窗口越大,去噪效果越強,但細節損失也越多。

自適應中值濾波器

  • 窗口大小隨噪聲情況動態調整,最小窗口大小通常為 3×33×3,最大窗口大小為 k×kk×k(如 7×77×7 或 11×1111×11)。
  • 自適應窗口能夠平衡去噪和細節保留。


加入椒鹽雜訊來測試自適應中值濾波與中值濾波差異

自適應中值濾波與中值濾波的差異

自適應濾波處理的結果明顯比中值濾波好上很多,但處理時間也是多了非常多。



自適應中值濾波程式碼

import cv2

import numpy as np

def adaptive_median_filter(image, max_kernel_size=7):

"""

自適應中值濾波器

:param image: 輸入的灰階圖像

:param max_kernel_size: 最大的窗口大小

:return: 濾波後的圖像

"""

# 獲取圖像的尺寸

height, width = image.shape

# 創建輸出圖像

output_image = image.copy()

# 中值濾波的核心

for i in range(1, height - 1):

for j in range(1, width - 1):

# 設定初始窗口大小

kernel_size = 3

while kernel_size <= max_kernel_size:

# 提取窗口區域

x_start = max(i - kernel_size // 2, 0)

x_end = min(i + kernel_size // 2 + 1, height)

y_start = max(j - kernel_size // 2, 0)

y_end = min(j + kernel_size // 2 + 1, width)

# 擷取窗口的區域

window = image[x_start:x_end, y_start:y_end]

# 計算窗口中的中位數

median = np.median(window)

# 如果原像素值與中位數差異過大,則替換

if abs(image[i, j] - median) > 0:

output_image[i, j] = median

break

else:

# 如果當前窗口的中位數已經可以接受,則不再增加窗口大小

if kernel_size == max_kernel_size:

break

kernel_size += 2 # 增加窗口的大小

return output_image

# 使用範例

image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

output_image = adaptive_median_filter(image, max_kernel_size=7)

# 顯示結果

cv2.imshow("Adaptive Median Filter", output_image)

cv2.waitKey(0)

cv2.destroyAllWindows()

程式碼詳細解釋:

  1. kernel_size:這是濾波器使用的窗口大小,開始時為3,然後每次增加2直到達到最大大小 max_kernel_size
  2. np.median(window):這是計算當前窗口內的中位數,這對於去除椒鹽噪聲非常有效。
  3. abs(image[i, j] - median) > 0:這個條件用來檢查當前像素值和中位數的差距。如果差距大,則將像素值替換為中位數,否則嘗試增大窗口。

參數:

  • max_kernel_size:這是最大窗口大小。可以根據圖像的大小和噪聲的情況進行調整。如果圖像噪聲較大,可以選擇較大的窗口。

優點:

  • 去噪聲:自適應中值濾波非常適合去除椒鹽噪聲。
  • 邊緣保護:由於濾波器會根據圖像內容調整窗口大小,它不會過度模糊細節,對邊緣保護效果較好。

缺點:

  • 計算時間:圖像尺寸越大,像素數量越多,濾波處理需要的計算次數也越多,計算時間呈線性增加

可能的改進:

  • 增加閾值:可以設定一些條件來判斷何時應該調整窗口大小,這樣可以更精確地控制噪聲去除過程。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.