数字图像处理之平滑的频率域滤波

边缘和其他尖锐变化(如噪声)在图像的灰度级中主要处于傅里叶变换的高频部分. 因此, 平滑(模糊)可以通过衰减指定图像傅里叶变换中高频成分的范围来实现.

G(u, v) = H(u, v)F(u, v)

目标是选择一个滤波器变换函数H(u, v)以衰减F(u, v)的高频成分产生G(u, v).

  • 理想低通滤波器

  • 巴特沃斯低通滤波器

  • 高斯低通滤波器

1. 理想低通滤波器

最简单的低通滤波器是"截断"傅里叶变换中所有高频成分, 这些成分处在距离变换原点的距离比指定距离D0要远得多的位置. 这种滤波器称为二维理想低通滤波器,
其变换函数为:

)

在这里插入图片描述
在这里插入图片描述

使用低通滤波器所得到的结果如下所示. 低通滤波器滤除了高频成分, 所以使得图像模糊. 由于理想低通滤波器的过度特性过于急峻, 所以会产生了振铃现象.

在这里插入图片描述

2. 巴特沃斯低通滤波器

在这里插入图片描述
在这里插入图片描述

同样的, D0表示通带的半径, 2表示的是巴特沃斯滤波器的次数. 随着次数的增加, 振铃现象会越来越明显.

3. 高斯低通滤波器

在这里插入图片描述


from builtins import *

import cv2
import numpy as np
import matplotlib.pyplot as plt


def butterworthPassFilter(image, d, n):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):
        transform_matrix = np.zeros(image.shape)
        center_port = tuple(map(lambda x: int((x-1)/2), image.shape))
        for i in range(transform_matrix.shape[0]):
            for j in range(transform_matrix.shape[1]):
                def cal_distance(pa, pb):
                    from math import sqrt
                    dist = sqrt((pa[0] - pb[0])**2 + (pa[1] - pb[1])**2)

                    return dist
                dis = cal_distance(center_port, (i, j))
                transform_matrix[i, j] = 1/((1+(d/(dis+0.00000001)))**n)
        return transform_matrix
    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/apple.png', 0)
    plt.subplot(121)
    plt.axis("off")
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.axis('off')
    plt.imshow(butterworthPassFilter(img, 10, 2), cmap="gray")
    plt.show()

from builtins import *

import cv2
import numpy as np
import matplotlib.pyplot as plt


def GaussianLowPassFilter(image, d):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):
        transform_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x: int((x-1)/2), image.shape))
        for i in range(transform_matrix.shape[0]):
            for j in range(transform_matrix.shape[1]):
                def cal_distance(pa, pb):
                    from math import sqrt
                    dist = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
                    return dist
                dis = cal_distance(center_point, (i, j))
                transform_matrix[i, j] = np.exp(-(dis**2)/(2*(d**2)))
        return transform_matrix
    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/apple.png', 0)
    plt.subplot(121)
    plt.axis("off")
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.axis('off')
    plt.imshow(GaussianLowPassFilter(img, 30), cmap="gray")
    plt.show()

from builtins import *

import cv2
import numpy as np
import matplotlib.pyplot as plt


def GaussianHighPassFilter(image, d):
    f = np.fft.fft2(image)
    fshift = np.fft.fftshift(f)

    def make_transform_matrix(d):
        transform_matrix = np.zeros(image.shape)
        center_point = tuple(map(lambda x: int((x-1)/2), image.shape))
        for i in range(transform_matrix.shape[0]):
            for j in range(transform_matrix.shape[1]):
                def cal_distance(pa, pb):
                    from math import sqrt
                    dist = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
                    return dist
                dis = cal_distance(center_point, (i, j))
                transform_matrix[i, j] = 1-np.exp(-(dis**2)/(2*(d**2)))
        return transform_matrix
    d_matrix = make_transform_matrix(d)
    new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))

    return new_img


if __name__ == '__main__':
    img = cv2.imread('../pic/apple.png', 0)
    plt.subplot(121)
    plt.axis("off")
    plt.imshow(img, cmap='gray')
    plt.subplot(122)
    plt.axis('off')
    plt.imshow(GaussianHighPassFilter(img, 100), cmap="gray")
    plt.show()


  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨痕_777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值