数字图像处理python实现-图像去噪之空间域自适应滤波

内容简介

  • 自适应滤波器
    • 自适应局部降低噪声滤波
    • 自适应中值滤波

自适应滤波器

自适应局部降低噪声滤波

先看书上的介绍如下:
数字图像处理python实现-图像去噪之空间域自适应滤波_第1张图片
解释如下:
数字图像处理python实现-图像去噪之空间域自适应滤波_第2张图片
这个滤波的编码方面关键点在

  1. 总体方差的未知,
  2. 以及高斯噪声和原图相互独立,故在实际情况中是无法做到高斯噪声参数的正确估计,

如果明确了高斯参数的值,上面过程的编码非常简单,这里故不给出!!!
但是在实际过程中的高斯噪声处理,在小波域去噪的效果非常好,特别是BM3D算法在小波域章节将做介绍!!!

自适应中值滤波

如下这里使用我们上课时讲义的介绍,感觉这里会更容易理解:
数字图像处理python实现-图像去噪之空间域自适应滤波_第3张图片
分为两个步骤

  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()

效果如下:

这里没有对边界做特殊处理,用的黑框,这里读者可以用边缘复制等处理都行,但是从这里可以看出自适应中值滤波和普通中值滤波的区别主要有3个方面:

  1. 自适应中值滤波细节和边缘损失少
  2. 普通中值滤波增大窗口的话细节损失会变得更多
  3. 两种滤波的选择在于速度和效果的把握,速度普通中值滤波快,效果自适应滤波更好

转载我博客应当经我允许,至少要把原文链接放在文章最前面,这是对本人辛苦原创基本的尊重。

上一篇:数字图像处理python实现-图像去噪之空间域统计排序滤波
下一篇:数字图像处理杂项-同态滤波

你可能感兴趣的:(数字图像处理)