分享免费的编程资源和教程

网站首页 > 技术教程 正文

傅里叶变换

goqiw 2024-11-26 02:54:54 技术教程 36 ℃ 0 评论

傅里叶变换(FFT)常被用来分析滤波器的频率特性, 我们可用2维离散傅里叶变换 (DFT) 分析图像频域特性。至于FFT的定义和意义我就不在这里展开, 了大家可以自己去了解一下。其中,opencv中FFT的涉及到 cv2.dft(),cv2.idft()等函数。

我们先来看看, 如果对图像的高频和低频部分进行过滤,产生的图像有什么特性呢?我们可以从下面的图像感受一下:

def get_low_high_f(img, radius_ratio):
    """
    获取低频和?频部分图像
    """
    # 傅?叶变换
    # np.fft.fftn
    f = np.fft.fftn(img)  # Compute the N-dimensional discrete Fourier Transform. 零频率分量位于频谱图像的左上?
    fshift = np.fft.fftshift(f)  # 零频率分量会被移到频域图像的中?位置,即低频
    # 获取低频和?频部分
    hight_parts_fshift = filter_low_f(img, fshift.copy(), radius_ratio=radius_ratio)  # 过滤掉中?低频
    low_parts_fshift = filter_high_f(img, fshift.copy(), radius_ratio=radius_ratio)
    low_parts_img = ifft(low_parts_fshift)  # 先sift回来,再反傅?叶变换
    high_parts_img = ifft(hight_parts_fshift)
    # 显?原始图像和?通滤波处理图像
    img_new_low = (low_parts_img - np.amin(low_parts_img)) / (np.amax(low_parts_img) - np.amin(low_parts_img) + 0.00001)
    img_new_high = (high_parts_img - np.amin(high_parts_img) + 0.00001) / (np.amax(high_parts_img) - np.amin(high_parts_img) + 0.00001)
    # uint8
    img_new_low = np.array(img_new_low*255, np.uint8)
    img_new_high = np.array(img_new_high * 255, np.uint8)
    return img_new_low, img_new_high

def ifft(fshift):
    """
    傅?叶逆变换
    """
    ishift = np.fft.ifftshift(fshift)  # 把低频部分sift回左上?
    iimg = np.fft.ifftn(ishift)  # 出来的是复数,?法显?
    iimg = np.abs(iimg)  # 返回复数的模
    return iimg

def fft(img):
    """
    傅?叶变换
    """
    f = np.fft.fft2(img)
    fshift = np.fft.fftshift(f)
    magnitude_spectrum = 20*np.log(np.abs(fshift))

    return magnitude_spectrum

例子2:

例子3:

我们有没有发现比较有趣的现象? 例子2和1及3相比,低频分量更多一些,轮廓边界也不清晰, 这就为后期图像增强和处理提高了思路。


图像模糊和增强处理后效果:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表