问题三十五:傅立叶变换——带通滤波

在这里插入图片描述
傅里叶变换(Fourier Transform)是一种用于分析信号的数学工具,它将信号分解成若干个不同频率的正弦和余弦函数。在图像处理中,傅里叶变换可以用来分析图像中各个频率的成分,从而进行滤波、增强等操作。

在傅里叶变换中,频率表示了信号的周期性特征。具体来说,一个频率为f的正弦函数可以表示为:
s i n ( 2 π f t ) sin(2πft) sin(2πft)
其中,t表示时间,f表示频率。傅里叶变换的基本思想就是将一个信号分解成若干个不同频率的正弦和余弦函数的叠加,即:
f ( t ) = Σ ( A k ∗ s i n ( 2 π f k t ) + B k ∗ c o s ( 2 π f k t ) ) f(t) = Σ(A_k * sin(2πf_kt) + B_k * cos(2πf_kt)) f(t)=Σ(Aksin(2πfkt)+Bkcos(2πfkt))
其中, A k A_k Ak B k B_k Bk是傅里叶变换的系数, f k f_k fk表示第k个频率。

在图像处理中,傅里叶变换可以将一个图像分解成若干个不同频率的正弦和余弦函数的叠加。我们可以通过对这些频率成分的增强或滤波,对图像进行增强或降噪的操作。

带通滤波是一种常用的图像滤波方法,它可以在一定范围内保留图像的某些频率成分,同时去除其他频率成分。具体来说,带通滤波将一个频率范围内的所有频率成分都放大或保留,而其他频率成分则被去除或削弱。

下面是一个Python实现带通滤波的示例代码:

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

def bandpass_filter(img, lowcut, highcut):
    """
    带通滤波
    :param img: 原图像
    :param lowcut: 低频截止频率
    :param highcut: 高频截止频率
    :return: 滤波后的图像
    """
    # 将图像转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 进行傅里叶变换
    f = np.fft.fft2(gray)
    fshift = np.fft.fftshift(f)

    # 构建高斯滤波器
    rows, cols = gray.shape
    mid_row, mid_col = int(rows / 2), int(cols / 2)
    sigma = 5  # 高斯滤波器的标准差
    x, y = np.meshgrid(np.arange(cols) - mid_col, np.arange(rows) - mid_row)
    g = np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2))

    # 构建带通滤波器
    bp = np.zeros((rows, cols), np.float32)
    d = np.zeros((rows, cols), np.float32)
    for i in range(rows):
        for j in range(cols):
            d[i, j] = np.sqrt((i - mid_row) ** 2 + (j - mid_col) ** 2)
            if lowcut <= d[i, j] <= highcut:
                bp[i, j] = 1

    # 将滤波器应用到频域图像上
    fshift_bp = fshift * bp

    # 进行傅里叶反变换
    f_ishift = np.fft.ifftshift(fshift_bp)
    img_back = np.fft.ifft2(f_ishift)
    img_back = np.abs(img_back)

    # 对图像进行归一化
    img_back = (img_back - np.min(img_back)) / (np.max(img_back) - np.min(img_back))

    # 将图像转换为8位灰度图像
    img_back = np.uint8(img_back * 255)

    return img_back

# 读取图像
img = cv2.imread('lena.jpg')

# 进行带通滤波
img_filtered = bandpass_filter(img, 20, 80)

# 显示原图和滤波后的图像
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(img_filtered, cmap='gray')
plt.title('Filtered Image')
plt.show()

这段代码中,我们首先将图像转换为灰度图像,然后进行傅里叶变换。接着,我们构建一个高斯滤波器,用于平滑频域图像,并构建一个带通滤波器,用于保留一定范围内的频率成分。将带通滤波器应用到频域图像上,并进行傅里叶反变换,得到滤波后的图像。

最后,我们对图像进行归一化和类型转换,以便显示和保存图像。在本例中,我们使用matplotlib库显示原图和滤波后的图像。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值