opencv 利用傅里叶变换获取低频和高频部分图像-07

1. 效果

2. 代码

# -*- coding: utf-8 -*-
import cv2
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


def filter_high_f(fshift, radius_ratio):
    """
    过滤掉除了中心区域外的高频信息
    """
    # 1, 生成圆形过滤器, 圆内值1, 其他部分为0的过滤器, 过滤
    template = np.zeros(fshift.shape, np.uint8)
    crow, ccol = int(fshift.shape[0] / 2), int(fshift.shape[1] / 2)  # 圆心
    radius = int(radius_ratio * img.shape[0] / 2)
    if len(img.shape) == 3:
        cv2.circle(template, (crow, ccol), radius, (1, 1, 1), -1)
    else:
        cv2.circle(template, (crow, ccol), radius, 1, -1)
    # 2, 过滤掉除了中心区域外的高频信息
    return template * fshift


def filter_low_f(fshift, radius_ratio):
    """
    去除中心区域低频信息
    """
    # 1 生成圆形过滤器, 圆内值0, 其他部分为1的过滤器, 过滤
    filter_img = np.ones(fshift.shape, np.uint8)
    crow, col = int(fshift.shape[0] / 2), int(fshift.shape[1] / 2)
    radius = int(radius_ratio * img.shape[0] / 2)
    if len(img.shape) == 3:
        cv2.circle(filter_img, (crow, col), radius, (0, 0, 0), -1)
    else:
        cv2.circle(filter_img, (crow, col), radius, 0, -1)
    # 2 过滤中心低频部分的信息
    return filter_img * fshift


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


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(fshift.copy(), radius_ratio=radius_ratio)  # 过滤掉中心低频
    low_parts_fshift = filter_high_f(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


if __name__ == '__main__':
    radius_ratio = 0.5  # 圆形过滤器的半径:ratio * w/2
    img = cv.imread('../images/bb.jpg', cv2.IMREAD_GRAYSCALE)
    low_freq_part_img, high_freq_part_img = get_low_high_f(img, radius_ratio=radius_ratio)  # multi channel or single

    plt.subplot(131), plt.imshow(img, 'gray'), plt.title('Original Image')
    plt.axis('off')
    plt.subplot(132), plt.imshow(low_freq_part_img, 'gray'), plt.title('low_freq_img')
    plt.axis('off')
    plt.subplot(133), plt.imshow(high_freq_part_img, 'gray'), plt.title('high_freq_img')
    plt.axis('off')
    plt.show()

 

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenCV(开放源代码计算机视觉库)是一个用于计算机视觉和机器学习领域的开源库。在OpenCV中,傅里叶变换(Fourier Transform)被广泛应用于图像处理和分析中。 傅里叶变换是一种将时域信号转换为频域信号的数学变换。在图像处理中,傅里叶变换可以将一个图像从空间域转换到频域。通过傅里叶变换,我们可以获取图像中的频率信息,包括高频低频和中频成分。 在OpenCV中,可以使用函数cv2.dft()来进行傅里叶变换。该函数接受一个输入图像和一个标志参数来控制变换的类型。通过傅里叶变换,可以将图像从空域转换到频域,并且可以使用逆变换将频域图像转换回空域。 傅里叶变换图像处理中有许多应用。其中一个重要的应用是图像滤波。通过对图像进行傅里叶变换,我们可以将图像从频域进行滤波,然后使用逆变换将其转换回空域。这种方法可以用于去除图像中的噪声或增强图像的某些频率成分。 傅里叶变换还可以应用于图像压缩。通过将图像从空域转换到频域,并且只保留一部分频率成分,我们可以有效地压缩图像的数据量。在解压缩时,可以使用逆变换将频域图像转换回空域。 总而言之,傅里叶变换是一种在图像处理中非常重要的数学工具。它可以帮助我们理解图像的频率性质并进行相应的处理。OpenCV提供了方便的功能来进行傅里叶变换,并且可以应用于图像滤波和压缩等各种应用。 ### 回答2: OpenCV中的傅里叶变换是一种将图像从空间域转换到频率域的方法。傅里叶变换可以用于图像处理中的多个任务,包括滤波、图像增强和图像分析。 在OpenCV中,可以使用`cv2.dft()`函数来进行傅里叶变换。该函数的输入可以是灰度图像或浮点型彩色图像。输出为一个复数数组,表示变换后图像的幅度和相位信息。 傅里叶变换的基本步骤如下: 1. 将输入图像转换为灰度图像(如果不是灰度图像)。 2. 根据需要,对图像进行填充或裁剪,以确保图像的尺寸是2的幂。这是因为傅里叶变换要求输入图像的尺寸是2的幂。 3. 对图像应用`cv2.dft()`函数进行傅里叶变换。 4. 可选地,对变换后的图像进行频率域操作,如滤波或增强。 5. 对变换后的图像应用`cv2.idft()`函数进行傅里叶逆变换,将图像从频率域转换回空间域。 6. 可选地,对逆变换后的图像进行后处理,如归一化或类型转换。 利用傅里叶变换,可以实现图像的频率域滤波,例如通过去除高频噪声或低频噪声来实现图像增强。还可以实现图像的频谱分析,例如确定图像的主要频率成分或频谱特征。 总之,OpenCV中的傅里叶变换是一种功能强大的图像处理工具,它可以用于多种任务,包括滤波、增强和分析。通过了解傅里叶变换的基本步骤和原理,我们可以更好地利用这个工具来处理图像数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值