1#!/usr/bin/env python
2
3import cv2
4import numpy as np
5import sys
6
7
8def shift_dft(src, dst=None):
9    '''
10        Rearrange the quadrants of Fourier image so that the origin is at
11        the image center. Swaps quadrant 1 with 3, and 2 with 4.
12
13        src and dst arrays must be equal size & type
14    '''
15
16    if dst is None:
17        dst = np.empty(src.shape, src.dtype)
18    elif src.shape != dst.shape:
19        raise ValueError("src and dst must have equal sizes")
20    elif src.dtype != dst.dtype:
21        raise TypeError("src and dst must have equal types")
22
23    if src is dst:
24        ret = np.empty(src.shape, src.dtype)
25    else:
26        ret = dst
27
28    h, w = src.shape[:2]
29
30    cx1 = cx2 = w/2
31    cy1 = cy2 = h/2
32
33    # if the size is odd, then adjust the bottom/right quadrants
34    if w % 2 != 0:
35        cx2 += 1
36    if h % 2 != 0:
37        cy2 += 1
38
39    # swap quadrants
40
41    # swap q1 and q3
42    ret[h-cy1:, w-cx1:] = src[0:cy1 , 0:cx1 ]   # q1 -> q3
43    ret[0:cy2 , 0:cx2 ] = src[h-cy2:, w-cx2:]   # q3 -> q1
44
45    # swap q2 and q4
46    ret[0:cy2 , w-cx2:] = src[h-cy2:, 0:cx2 ]   # q2 -> q4
47    ret[h-cy1:, 0:cx1 ] = src[0:cy1 , w-cx1:]   # q4 -> q2
48
49    if src is dst:
50        dst[:,:] = ret
51
52    return dst
53
54if __name__ == "__main__":
55
56    if len(sys.argv)>1:
57        im = cv2.imread(sys.argv[1])
58    else :
59        im = cv2.imread('../data/baboon.jpg')
60        print "usage : python dft.py <image_file>"
61
62    # convert to grayscale
63    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
64    h, w = im.shape[:2]
65
66    realInput = im.astype(np.float64)
67
68    # perform an optimally sized dft
69    dft_M = cv2.getOptimalDFTSize(w)
70    dft_N = cv2.getOptimalDFTSize(h)
71
72    # copy A to dft_A and pad dft_A with zeros
73    dft_A = np.zeros((dft_N, dft_M, 2), dtype=np.float64)
74    dft_A[:h, :w, 0] = realInput
75
76    # no need to pad bottom part of dft_A with zeros because of
77    # use of nonzeroRows parameter in cv2.dft()
78    cv2.dft(dft_A, dst=dft_A, nonzeroRows=h)
79
80    cv2.imshow("win", im)
81
82    # Split fourier into real and imaginary parts
83    image_Re, image_Im = cv2.split(dft_A)
84
85    # Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)
86    magnitude = cv2.sqrt(image_Re**2.0 + image_Im**2.0)
87
88    # Compute log(1 + Mag)
89    log_spectrum = cv2.log(1.0 + magnitude)
90
91    # Rearrange the quadrants of Fourier image so that the origin is at
92    # the image center
93    shift_dft(log_spectrum, log_spectrum)
94
95    # normalize and display the results as rgb
96    cv2.normalize(log_spectrum, log_spectrum, 0.0, 1.0, cv2.NORM_MINMAX)
97    cv2.imshow("magnitude", log_spectrum)
98
99    cv2.waitKey(0)
100    cv2.destroyAllWindows()
101