FFT减法OpenCV

2024-10-04 01:37:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理图像,我想从中删除背景。为此,我将使用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() 

结果如下:

  • 试验编号1: Test n°1: Cell - Background

  • 试验编号2: Test n°2: FullAcq. - whitebox

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

谢谢大家

附言:是的,第一张照片的质量很低,我只需要理解为什么我会得到这个结果


Tags: imageshiftnppltcv2backgrounddftfloat32
1条回答
网友
1楼 · 发布于 2024-10-04 01:37:40

使用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))

相关问题 更多 >