我正在处理图像,我想从中删除背景。为此,我将使用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()
结果如下:
我在这里要问的是:如果我在一次(图像背面)和第二次(图像背面)中进行减法,为什么会得到相同的结果?我不应该得到完全相反的结果吗?如果没有,我错过了什么
谢谢大家
附言:是的,第一张照片的质量很低,我只需要理解为什么我会得到这个结果
使用
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))
相关问题 更多 >
编程相关推荐