БПФ вычитание - OpenCV - PullRequest
       89

БПФ вычитание - OpenCV

0 голосов
/ 07 января 2020

Я работаю над изображением и хочу удалить из него фон. Для этого я собираюсь использовать 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

Что я спрашиваю здесь: почему я получаю тот же результат, если я вычитаю в один раз (изображение - назад) и во второй (назад - изображение)? Разве я не должен получить прямо противоположные результаты? Если нет, то чего мне не хватает?

Спасибо вам всем!

ps: да, изображения самые низкие Q, мне просто нужно понять, почему я получаю этот результат!

1 Ответ

2 голосов
/ 07 января 2020

Вы получаете тот же результат с image-background и background-image, потому что вы берете абсолютное значение результата: вы фактически сравниваете abs(image-background) и abs(background-image), которые по определению идентичны (вы используете cv2.magnitude, который вычисляет абсолютное значение).


Обратите внимание, что вычисление abs(ifft(fft(image)-fft(background))) такое же, как простое вычисление abs(image-background). Нет необходимости go в домене Фурье для сложения и вычитания. Это потому, что преобразование Фурье является линейной функцией. Линейная функция T характеризуется T(ax+by) == a*T(x) + b*T(y), с a и b константами. Следовательно, сложение или вычитание может быть выполнено до или после преобразования Фурье для получения того же результата

Область Фурье полезна для вычисления свертки: conv(x,y) == ifft(fft(x)*fft(y)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...