数字图像处理之二维傅里叶变换

二维连续傅里叶变换

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

二维离散傅里叶变换

在这里插入图片描述

二维离散傅里叶变换的性质

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


from builtins import print, int

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


# shape: 600 * 600
img = cv2.imread('../pic/Fig0438(a)(bld_600by600).tif', 0)
# 返回的是复数 dtype.complex128
fft = np.fft.fft2(img)
print("fft is: ", fft)
# 平移
fftshift = np.fft.fftshift(fft)
print("fftshift is: ", fftshift)
# 频谱 dtype.float64 magnitude_spectrum[180,180] = 329.2611
magnitude_spectrum = 20 * np.log(np.abs(fftshift))
print(magnitude_spectrum[300, 300])

# 如果想要用cv2.imshow()显示
# magnitude_spectrum_uint8 = np.uint8(255 * (magnitude_spectrum / np.max(magnitude_spectrum)))
# cv2.imshow("origin", img)
# cv2.imshow("magnitude_spectrum_uint8", magnitude_spectrum_uint8)
# cv2.waitKey(0)
rows, cols = img.shape
crow, ccol = rows / 2, cols / 2
# 频率中心区域添加60x60的蒙板, 相当于过滤了低频部分
fftshift[int(crow - 30):int(crow+30), int(ccol-30):int(crow+30)] = 0
magnitude_spectrum_filter = 20 * np.log(np.abs(fftshift)+0.0000001)
# 中心平移回到左上角
f_ishift = np.fft.ifftshift(fftshift)
# 使用FFT逆变换, 结果是复数
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
# img_back_uint8 = np.uint8(255 * (img_back / np.max(img_back)))
# cv2.imshow("img_back_uint8", img_back_uint8)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.subplot(221)
plt.imshow(img, cmap='gray')
plt.title('origin image')
# 省略x, y坐标
plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('magnitude_spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(magnitude_spectrum_filter, cmap='gray')
plt.title('High Pass Filter'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_back, cmap='gray')
plt.title("High Pass Result"), plt.xticks([]), plt.yticks([])
plt.show()



"""
Created by HenryMa on 2020/8/27
"""

__author__ = 'HenryMa'

from builtins import print, int

import cv2
import numpy as np


img = cv2.imread('../pic/Fig0438(a)(bld_600by600).tif', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 平移还是要靠numpy
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# float32
print(dft.dtype)

rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)

# 创建蒙板
mask = np.ones((rows, cols, 2), np.uint8)
msize = 70
mask[crow-int(msize/2): crow+int(msize/2), ccol-int(msize/2): ccol+int(msize/2)] = 0
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)

# 此时img_back为复数
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

cv2.imshow('origin', img)
cv2.imshow('img_back', img_back)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 数字图像处理是指对数字形式的图像进行各种操作和处理的一门技术。二维傅里叶变换数字图像处理中常用的一种变换方法,主要用于将图像从空间域转换到频域。 在Java中,我们可以使用一些图像处理库来实现二维傅里叶变换。例如,常用的库有OpenCV和ImageJ。这些库提供了丰富的函数和方法用于加载、处理和保存图像,同时也支持二维傅里叶变换。我们可以通过调用相应的函数来完成这一转换。 具体实现二维傅里叶变换的步骤如下: 1. 导入图像处理库。 2. 使用库提供的函数加载图像,并将其转换成灰度图像。这一步骤可以通过将彩色图像的三个通道的像素值取平均来实现。 3. 使用库提供的函数将灰度图像进行二维傅里叶变换。该函数将返回一个表示频域图像的复数数组。 4. 可选的,可以对频域图像进行进一步处理,如滤波、增强等。 5. 使用库提供的函数将频域图像进行逆变换,以得到空域图像。逆变换后的图像通常是一个复数数组,需要进一步处理才能显示。 6. 根据需要,将逆变换后的图像进行调整,如将复数值映射到[0,255]范围内,将实部或虚部与频域作差等。 7. 使用库提供的函数保存处理后的图像。 总的来说,通过以上步骤,我们可以在Java中实现二维傅里叶变换,完成对数字图像的频域分析和处理。这样的变换可以帮助我们提取图像的频域特征,如纹理、边缘等,对于图像处理和分析有着重要的应用。 ### 回答2: 数字图像处理是指利用计算机对图像进行处理和分析的一种技术。其中,二维傅里叶变换数字图像处理中的重要工具之一。它是将图像从像素域转换到频域的一种方法,可以将图像的空间域信息转换为频率域信息,从而实现对图像的频域处理。 在Java中,可以使用Java的图像处理库或者开源库来实现二维傅里叶变换。其中,常用的Java图像处理库有Java Advanced Imaging (JAI)和Java Image Processing Toolkit (JIPT)等。 首先,需要加载原始图像,并将其转换为合适的数据结构。Java中可以使用BufferedImage类来加载和处理图像数据。然后,可以使用合适的库函数来对图像进行二维傅里叶变换。这些库函数会将图像从像素域转换为频域,并返回频域的结果。 接下来,可以对频域的图像进行相应的处理。例如,可以进行频域滤波、频域增强等操作来对图像进行改进或者分析。在Java中,可以使用库函数来实现这些操作。 最后,可以将经过频域处理的图像再次进行反变换,将其从频域转换回像素域。这一步可以使用相应的反二维傅里叶变换库函数来实现。 总之,数字图像处理中的二维傅里叶变换是一种重要的技术,可以提取图像的频域信息并进行相应的处理。在Java中,可以使用相应的图像处理库或者开源库来实现二维傅里叶变换,并通过对频域图像进行处理来改进和分析图像。 ### 回答3: 数字图像处理是利用计算机对图像进行处理的一种技术。二维傅里叶变换数字图像处理中常用的一种方法,它可以将图像从空间域转换到频率域。 在Java中,我们可以使用一些图像处理库来实现二维傅里叶变换。比如,我们可以使用Java中的OpenCV库来进行图像处理操作。 首先,我们需要导入OpenCV库。可以在Java项目的依赖中添加OpenCV库的引用。然后,我们可以使用OpenCV提供的函数来读取图像文件,如imread函数。 接下来,我们可以使用OpenCV库的dft函数来对图像进行二维傅里叶变换。该函数将图像从空间域转换到频率域。我们可以指定变换的尺寸,一般选择与图像大小相同的尺寸。 在得到频率域表示后,我们可以进行一些频域处理操作,如滤波、增强等。然后,我们可以使用OpenCV库的idft函数将图像从频率域转换回空间域。 最后,我们可以使用OpenCV库的imwrite函数将处理后的图像保存到指定的文件中。 总之,利用Java中的OpenCV库,我们可以方便地进行数字图像处理,包括二维傅里叶变换。通过这种方法,我们可以将图像从空间域转换到频率域,进行一系列频域处理操作,并最终将图像转换回空间域,得到处理后的图像。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

墨痕_777

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

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

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

打赏作者

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

抵扣说明:

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

余额充值