内容簡介
- 自适應濾波器
-
- 自适應局部降低噪聲濾波
- 自适應中值濾波
自适應濾波器
自适應局部降低噪聲濾波
先看書上的介紹如下:
解釋如下:
這個濾波的編碼方面關鍵點在
- 總體方差的未知,
- 以及高斯噪聲和原圖互相獨立,故在實際情況中是無法做到高斯噪聲參數的正确估計,
如果明确了高斯參數的值,上面過程的編碼非常簡單,這裡故不給出!!!
但是在實際過程中的高斯噪聲處理,在小波域去噪的效果非常好,特别是BM3D算法在小波域章節将做介紹!!!
自适應中值濾波
如下這裡使用我們上課時講義的介紹,感覺這裡會更容易了解:
分為兩個步驟
- a程序保證有個可用的中值,
- b程序判斷目前像素值如果滿足條件則原值輸出,否則則輸出a程序的值
其中做法的原因上面的圖檔中已經注釋,下面給出代碼:
# 自适應中值濾波
# count 為最大視窗數,original 為原圖
def adaptiveMedianDeNoise(count, original):
# 初始視窗大小
startWindow = 3
# 卷積範圍
c = int(count/2)
rows, cols = original.shape
newI = np.zeros(original.shape)
for i in range(c, rows - c):
for j in range(c, cols - c):
k = int(startWindow / 2)
median = np.median(original[i - k:i + k + 1, j - k:j + k + 1])
mi = np.min(original[i - k:i + k + 1, j - k:j + k + 1])
ma = np.max(original[i - k:i + k + 1, j - k:j + k + 1])
if mi < median < ma:
if mi < original[i, j] < ma:
newI[i, j] = original[i, j]
else:
newI[i, j] = median
else:
while True:
startWindow = startWindow + 2
k = int(startWindow / 2)
median = np.median(original[i - k:i + k + 1, j - k:j + k + 1])
mi = np.min(original[i - k:i + k + 1, j - k:j + k + 1])
ma = np.max(original[i - k:i + k + 1, j - k:j + k + 1])
if mi < median < ma or startWindow > count:
break
if mi < median < ma or startWindow > count:
if mi < original[i, j] < ma:
newI[i, j] = original[i, j]
else:
newI[i, j] = median
return newI
def medianDeNoise(original):
rows, cols = original.shape
ImageDenoise = np.zeros(original.shape)
for i in range(3, rows - 3):
for j in range(3, cols - 3):
ImageDenoise[i, j] = np.median(original[i - 3:i + 4, j - 3:j + 4])
return ImageDenoise
def show(f, s, a, b, c):
plt.subplot(a, b, c)
plt.imshow(f, "gray")
plt.axis('on')
plt.title(s)
def main():
original = plt.imread("lena.tiff", 0)
rows, cols = original.shape
original_noise = pepperNoise(100000, original)
adapMedianDeNoise = adaptiveMedianDeNoise(7, original_noise)
mediDeNoise = medianDeNoise(original_noise)
plt.figure()
show(original, "original", 2, 2, 1)
show(original_noise, "original_noise", 2, 2, 2)
show(adapMedianDeNoise, "adaptiveMedianDeNoise", 2, 2, 3)
show(mediDeNoise, "medianDeNoise", 2, 2, 4)
plt.show()
效果如下:
這裡沒有對邊界做特殊處理,用的黑框,這裡讀者可以用邊緣複制等處理都行,但是從這裡可以看出自适應中值濾波和普通中值濾波的差別主要有3個方面:
- 自适應中值濾波細節和邊緣損失少
- 普通中值濾波增大視窗的話細節損失會變得更多
- 兩種濾波的選擇在于速度和效果的把握,速度普通中值濾波快,效果自适應濾波更好
轉載我部落格應當經我允許,至少要把原文連結放在文章最前面,這是對本人辛苦原創基本的尊重。
上一篇:數字圖像處理python實作-圖像去噪之空間域統計排序濾波
下一篇:數字圖像處理雜項-同态濾波