FFT 减法 - OpenCV

FFT subtraction - OpenCV

我正在处理一张图片,我想从中删除背景。为此,我将使用 DFT,然后减去我的图像和背景(+嘈杂的东西)之间的差异。

我需要了解的是,如果我执行以下操作,为什么会得到相同的结果:

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() 

结果如下:

我想问的是:如果我一次(图像 - 背面)和第二次(背面 - 图像)相减,为什么我会得到相同的结果?我不应该得到完全相反的结果吗?如果没有,我错过了什么?

谢谢大家!

p.s.: 是的,第一张图片质量很低,我只需要了解为什么我会得到这个结果!

你得到与 image-backgroundbackground-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),具有 ab 常数。因此,在傅里叶变换之前或之后进行加法或减法都可以得到相同的结果

傅立叶域对于计算卷积很有用:conv(x,y) == ifft(fft(x)*fft(y))