2d DFT изображения и затем его обратное - PullRequest
0 голосов
/ 13 июня 2018

Я вычисляю 2D-DFT по следующей формуле: img1 = Wm @ img @ Wn, размер изображения - M N, здесь img - мое изображение, @ обозначает умножение матрицы.Wm - это матрица M M, заданная как Wm (m, k) = ((1 / M) ^ 0,5) exp ((- j * 2 * pi k m) / M) и Wnэто N * N матрица, заданная как Wn (n, l) = ((1 / N) ^ 0.5) exp ((- j * 2 * pi l n) / N), где M * N - размеризображения, но обратное вычисление не приводит к исходному изображению.

import numpy as np
import math
import cv2
path='E:\\python programs\\peppers.pgm'

#load image into img
img=cv2.imread(path,0)

height,width=img.shape
img=img.astype(np.complex64)

#img1 will contain dft of image
img1=np.zeros((height,width),dtype=np.complex64)
img=img.astype(np.complex64)

#performing centering of image
for x in range(width):
        for y in range(height):
            img[y,x]=img[y,x]*pow(1,x+y)

#obtaining twiddle matrix Wm                
tmp=1/(pow(height,0.5))
Wm=np.zeros((height,height),dtype=np.complex64)
for x in range(height):
   for y in range(height):
       Wm[y,x]=tmp*math.exp((-1*6.28*x*y)/height)

##obtaining twiddle matrix Wn        
tmp1=1/(pow(width,0.5))
Wn=np.zeros((width,width),dtype=np.complex64)
for x in range(width):
   for y in range(width):
        Wn[y,x]=tmp1*math.exp((-1*6.28*x*y)/width)

#computing dft
img1=Wm@img@Wn        

#img2 will contain inverse dft                      
img2=np.zeros((height,width),dtype=np.complex64)

Я вычислил idft, заменив Wm и Wn их комплексным сопряжением в формуле dft img2 = np.conj (Wm) @ img1@ np.conj (Wn)

#performing decentering
for i in range(width):
        for j in range(height):
            img2[j,i]=img2[j,i]*pow(1,i+j)

img2=img2.astype(np.uint8)

print(img2)
cv2.imshow('image',img2)
cv2.waitKey(0)&0xFF
cv2.destroyAllWindows()
...