我正在处理图像,并且想从中删除背景。为此,我将使用DFT,然后减去Image和背景之间的差异(+嘈杂的东西)。
我需要了解的是,如果我执行以下操作,为什么会得到相同的结果:
import cv2
import numpy as np
from matplotlib import pyplot as plt
from scipy import signal
#### FFT SUBSTRACT
#Extract image
CellImg = cv2.imread(r'cell.jpg',0)
BackImg = cv2.imread(r'back.jpg',0)
#Covnert to 32 float
CellImg_float32 = np.float32(CellImg)
BackImg_float32 = np.float32(BackImg)
print("Size Cell: "+str(np.shape(CellImg_float32)))
print("Size Back: "+str(np.shape(BackImg_float32)))
# DFT
dft_CellImg_float32 = cv2.dft(CellImg_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift_CellImg_float32 = np.fft.fftshift(dft_CellImg_float32)
dft_BackImg_float32 = cv2.dft(BackImg_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift_BackImg_float32 = np.fft.fftshift(dft_BackImg_float32)
# Subtract and inverse: CELL - BACKGROUND
dft_diff_cmb = dft_shift_CellImg_float32 - dft_shift_BackImg_float32
SubFFTImg_inverse_cmb = cv2.idft(np.fft.ifftshift(dft_diff_cmb))
SubFFTImg_cmb = cv2.magnitude(SubFFTImg_inverse_cmb[:,:,0],SubFFTImg_inverse_cmb[:,:,1])
# Subtract and inverse: BACKGROUND - CELL
dft_diff_bmc = dft_shift_BackImg_float32 - dft_shift_CellImg_float32
SubFFTImg_inverse_bmc = cv2.idft(np.fft.ifftshift(dft_diff_bmc))
SubFFTImg_bmc = cv2.magnitude(SubFFTImg_inverse_bmc[:,:,0],SubFFTImg_inverse_bmc[:,:,1])
# Plot Init image -> (Image - Background) & (Background - Image)
plt.figure()
plt.subplot(231),plt.imshow(CellImg, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(BackImg, cmap = 'gray')
plt.title('Background'), plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(SubFFTImg_cmb, cmap = 'gray')
plt.title('Image - Background'), plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(CellImg, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(BackImg, cmap = 'gray')
plt.title('Background'), plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(SubFFTImg_bmc, cmap = 'gray')
plt.title('Background - Image'), plt.xticks([]), plt.yticks([])
plt.show()
结果如下:
我在这里要问的是:如果一次减去(后退),第二次(后退),为什么我得到相同的结果?我不应该得到完全相反的结果吗?如果没有,我想念什么?
谢谢大家!
附注:是的,第一张图片的质量低,我只需要了解为什么会得到这个结果!
最佳答案
使用image-background
和background-image
会得到相同的结果,因为您要获取结果的绝对值:实际上,您正在比较abs(image-background)
和abs(background-image)
,它们在定义上是相同的(您正在使用cv2.magnitude
,它计算绝对值)。
请注意,计算abs(ifft(fft(image)-fft(background)))
与简单计算abs(image-background)
相同。无需去傅立叶域进行加法和减法。这是因为傅立叶变换是线性函数。线性函数T
的特征是T(ax+by) == a*T(x) + b*T(y)
,a
和b
常数。因此,可以在傅立叶变换之前或之后执行加法或减法以产生相同的结果
傅里叶域对于计算卷积很有用:conv(x,y) == ifft(fft(x)*fft(y))
。
关于python - FFT减法-OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631139/