Обратное преобразование Фурье дает ошибку «тип данных не поддерживается» - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь реализовать обратное преобразование Фурье.Вот мой код:

import numpy as np 
import cv2 as cv
import math 
import cmath
from matplotlib import pyplot as plt
image="test2.bmp" 
img=cv.imread(image,cv.IMREAD_GRAYSCALE)
#foruior transform 
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
#shifting for displaying 
dft_shift = np.fft.fftshift(dft)
#get the filter contains real and complex part 
t=1
a=0.1 
b=0.1
motion_filter=np.empty((img.shape[0],img.shape[1],2),dtype=np.complex_)
for x in range(img.shape[0]):
    for y in range(img.shape[1]):
        if x==0 and y==0:
            const1=math.pi*(1e-10)
        else:
            const1=math.pi*((x*a)+(y*b)) 
        #for real number
        motion_filter[x,y,0]=((t/const1)*(math.sin(const1))*(cmath.exp((0-1j)*(const1)))).real
        #for complex number
        motion_filter[x,y,1]=((t/const1)*(math.sin(const1))*(cmath.exp((0-1j)*(const1)))).imag
#processing
fshift = dft_shift*motion_filter
#shift back 
f_ishift = np.fft.ifftshift(fshift)
#inverse 
img_back = cv.idft(f_ishift)
#take real part 
img_back=img_back[:,:,0]
#show image 
plt.imshow(img_back,cmap='gray')
plt.show()

И ошибка возникает при выполнении:

img_back = cv.idft(f_ishift)

Сообщение об ошибке:

src тип данных = 15 неподдерживается

Как я могу исправить код?

1 Ответ

0 голосов
/ 13 ноября 2018

Согласно ответу в на этот другой вопрос , OpenCV idft требует вещественной матрицы, в которой действительные и мнимые компоненты хранятся в третьем измерении. Вы создаете эту матрицу:

motion_filter=np.empty((img.shape[0],img.shape[1],2),dtype=np.complex_)

Он имеет правильные размеры (2 по 3-му измерению для вещественных и мнимых компонентов), но имеет комплексное значение. Затем вы умножаете свое изображение в области Фурье (вещественная матрица с действительными и мнимыми компонентами вдоль 3-го измерения) с этой сложной матрицей, создавая комплексный выход:

fshift = dft_shift*motion_filter

Этот комплексный вывод не может использоваться в cv.idft. Вместо этого создайте свою матрицу фильтра как вещественную матрицу:

motion_filter=np.empty((img.shape[0],img.shape[1],2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...