如何在 Opencv 上绘制傅立叶变换 numpy 数组
How to draw on a Fourier transform numpy array Opencv
我想在 FFT 幅值图像上绘制黑色矩形并应用 IFFT。我尝试计算 FFT 我得到 2 个数组,一个用于幅度,另一个用于编辑幅度图像后的相位(我将其转换为 uint8)我不知道如何转换为 IFFT 的正确输入格式。
这是我正在使用的 FFT 代码:
dft = np.fft.fft2(img)
dft_shift = np.fft.fftshift(dft)
mag = np.abs(dft_shift)
ang = np.angle(dft_shift)
这是我用来重建图像的代码:
def reconstruct(mag,ang):
combined = np.multiply(mag, np.exp(1j*ang))
fftx = np.fft.ifftshift(combined)
ffty = np.fft.ifft2(fftx)
imgCombined = np.abs(ffty)
return imgCombined
- 在计算傅里叶变换之前,将图像转换为浮点数据类型。
- 创建一个遮罩并将其乘以幅度。
- 合并幅度和相位,并应用逆变换
代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def fourier(img):
dft = np.fft.fft2(np.float32(img))
dft_shift = np.fft.fftshift(dft)
mag = np.abs(dft_shift)
ang = np.angle(dft_shift)
return mag, ang
def inverse_fourier(mag, ang):
combined = np.multiply(mag, np.exp(1j*ang))
fftx = np.fft.ifftshift(combined)
ffty = np.fft.ifft2(fftx)
imgCombined = np.abs(ffty).astype(np.uint8)
return imgCombined
img = cv2.imread('./cameraman.tif', 0)
mag, ang = fourier(img)
mask = np.zeros(img.shape, dtype=img.dtype)
y,x = mask.shape[0], mask.shape[1]
cx = x//2
cy = y//2
mask[cy-50 : cy+50, cx-50 : cx+50] = 1.
mag = mag * mask
res = inverse_fourier(mag, ang)
mx = np.amax(np.log(mag+0.001))
tmp = np.uint8(255*(mag/mx))
_, ax = plt.subplots(2,2)
ax[0,0].imshow(img, cmap='gray')
ax[0,1].imshow(tmp, cmap='gray')
ax[1,0].imshow(mask, cmap='gray')
ax[1,1].imshow(res, cmap='gray')
plt.show()
结果
我想在 FFT 幅值图像上绘制黑色矩形并应用 IFFT。我尝试计算 FFT 我得到 2 个数组,一个用于幅度,另一个用于编辑幅度图像后的相位(我将其转换为 uint8)我不知道如何转换为 IFFT 的正确输入格式。 这是我正在使用的 FFT 代码:
dft = np.fft.fft2(img)
dft_shift = np.fft.fftshift(dft)
mag = np.abs(dft_shift)
ang = np.angle(dft_shift)
这是我用来重建图像的代码:
def reconstruct(mag,ang):
combined = np.multiply(mag, np.exp(1j*ang))
fftx = np.fft.ifftshift(combined)
ffty = np.fft.ifft2(fftx)
imgCombined = np.abs(ffty)
return imgCombined
- 在计算傅里叶变换之前,将图像转换为浮点数据类型。
- 创建一个遮罩并将其乘以幅度。
- 合并幅度和相位,并应用逆变换
代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def fourier(img):
dft = np.fft.fft2(np.float32(img))
dft_shift = np.fft.fftshift(dft)
mag = np.abs(dft_shift)
ang = np.angle(dft_shift)
return mag, ang
def inverse_fourier(mag, ang):
combined = np.multiply(mag, np.exp(1j*ang))
fftx = np.fft.ifftshift(combined)
ffty = np.fft.ifft2(fftx)
imgCombined = np.abs(ffty).astype(np.uint8)
return imgCombined
img = cv2.imread('./cameraman.tif', 0)
mag, ang = fourier(img)
mask = np.zeros(img.shape, dtype=img.dtype)
y,x = mask.shape[0], mask.shape[1]
cx = x//2
cy = y//2
mask[cy-50 : cy+50, cx-50 : cx+50] = 1.
mag = mag * mask
res = inverse_fourier(mag, ang)
mx = np.amax(np.log(mag+0.001))
tmp = np.uint8(255*(mag/mx))
_, ax = plt.subplots(2,2)
ax[0,0].imshow(img, cmap='gray')
ax[0,1].imshow(tmp, cmap='gray')
ax[1,0].imshow(mask, cmap='gray')
ax[1,1].imshow(res, cmap='gray')
plt.show()
结果