python - FFT减法-OpenCV

标签 python opencv image-processing fft dft

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

结果如下:
  • 测试n°1:
    Test n°1: Cell - Background
  • 测试n°2:
    Test n°2: FullAcq. - whitebox

  • 我在这里要问的是:如果一次减去(后退),第二次(后退),为什么我得到相同的结果?我不应该得到完全相反的结果吗?如果没有,我想念什么?

    谢谢大家!

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

    最佳答案

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

    关于python - FFT减法-OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59631139/

    相关文章:

    python - 导入错误 : cannot import name 'dnn_superres' for python example of super resolution with opencv

    opencv - 将三分之一的视频流转换为灰度并显示

    image-processing - 检查 OpenCV 中像素的透明度

    image-processing - 在 2D 网格上插值

    java - Sanselan 与 Java-Image-io

    matlab - 如何从黑白图片中提取车牌

    Python AST : several semantics unclear, 例如表达式上下文

    python - 在 Dropbox API Python 上实现 OAuth

    python - 使用 Python 高效地绘制 csv 格式的表格

    python - 从单个字符串到 1 列 DataFrame?