天天看點

數字圖像處理python實作-圖像去噪之空間域自适應濾波自适應濾波器

内容簡介

  • 自适應濾波器
    • 自适應局部降低噪聲濾波
    • 自适應中值濾波

自适應濾波器

自适應局部降低噪聲濾波

先看書上的介紹如下:

數字圖像處理python實作-圖像去噪之空間域自适應濾波自适應濾波器

解釋如下:

數字圖像處理python實作-圖像去噪之空間域自适應濾波自适應濾波器

這個濾波的編碼方面關鍵點在

  1. 總體方差的未知,
  2. 以及高斯噪聲和原圖互相獨立,故在實際情況中是無法做到高斯噪聲參數的正确估計,

如果明确了高斯參數的值,上面過程的編碼非常簡單,這裡故不給出!!!

但是在實際過程中的高斯噪聲處理,在小波域去噪的效果非常好,特别是BM3D算法在小波域章節将做介紹!!!

自适應中值濾波

如下這裡使用我們上課時講義的介紹,感覺這裡會更容易了解:

數字圖像處理python實作-圖像去噪之空間域自适應濾波自适應濾波器

分為兩個步驟

  1. a程序保證有個可用的中值,
  2. 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()
           

效果如下:

數字圖像處理python實作-圖像去噪之空間域自适應濾波自适應濾波器

這裡沒有對邊界做特殊處理,用的黑框,這裡讀者可以用邊緣複制等處理都行,但是從這裡可以看出自适應中值濾波和普通中值濾波的差別主要有3個方面:

  1. 自适應中值濾波細節和邊緣損失少
  2. 普通中值濾波增大視窗的話細節損失會變得更多
  3. 兩種濾波的選擇在于速度和效果的把握,速度普通中值濾波快,效果自适應濾波更好

轉載我部落格應當經我允許,至少要把原文連結放在文章最前面,這是對本人辛苦原創基本的尊重。

上一篇:數字圖像處理python實作-圖像去噪之空間域統計排序濾波

下一篇:數字圖像處理雜項-同态濾波