中值濾波器(Adaptive Median Filter)是一種針對噪聲去除的圖像處理技術,主要應用於處理含有椒鹽雜訊的圖像,但在椒鹽雜訊過大時就會面臨,若為了處理掉雜訊,使用的處理窗口(kernel)就要大一點,會造成圖像的邊緣模糊掉。
後面為解決這個問題,就發展了自適應中值濾波器,其概念源自於標準中值濾波的擴展,並結合了自適應算法的思想。
核心概念:
主要特性:
自適應濾波處理的結果明顯比中值濾波好上很多,但處理時間也是多了非常多。
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()
kernel_size
:這是濾波器使用的窗口大小,開始時為3,然後每次增加2直到達到最大大小 max_kernel_size
。np.median(window)
:這是計算當前窗口內的中位數,這對於去除椒鹽噪聲非常有效。abs(image[i, j] - median) > 0
:這個條件用來檢查當前像素值和中位數的差距。如果差距大,則將像素值替換為中位數,否則嘗試增大窗口。max_kernel_size
:這是最大窗口大小。可以根據圖像的大小和噪聲的情況進行調整。如果圖像噪聲較大,可以選擇較大的窗口。