I'm new to all of this, I would like to get a magnitude spectrum from an image and then rebuild the image from a modified magnitude spectrum.. But for now i'am getting a very dark reconstitution.
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('IMG.jpg',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, a = np.log(cv2.cartToPolar(dft_shift[:,:,0],dft_shift[:,:,1]))
# do somthing with m
x, y = cv2.polarToCart(np.exp(m), a)
back = cv2.merge([x, y])
f_ishift = np.fft.ifftshift(back)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(m, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back, cmap = 'gray')
plt.title('result'), plt.xticks([]), plt.yticks([])
plt.show()
the result
Can you guys help me figure out why is this so dark.
Thank in advance :)
EDIT
I tryed to normalise the image, but it's not working. I'm still having a very dark image.
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('IMG.jpg',0)
dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
m, a = np.log1p(cv2.cartToPolar(dft_shift[:,:,0],dft_shift[:,:,1]))
# modify m, then use the modify m to reconstruct
x, y = cv2.polarToCart(np.expm1(m), a)
back = cv2.merge([x, y])
f_ishift = np.fft.ifftshift(back)
img_back = cv2.idft(f_ishift, flags=cv2.DFT_SCALE)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
min, max = np.amin(img, (0,1)), np.amax(img, (0,1))
print(min,max)
# re-normalize to 8-bits
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
print(min,max)
img_back = cv2.normalize(img_back, None, alpha=0, beta=252, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
print(min,max)
plt.subplot(131),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(132),plt.imshow(m, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(133),plt.imshow(img_back, cmap = 'gray')
plt.title('result'), plt.xticks([]), plt.yticks([])
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
output:
0 252
0.36347726 5867.449
0 252
I would like to modify the magnitude spectrum and used the modify version to reconstruct the image.
idft(dft(X))=X/size(X)
so you have an attenuation factor – Ivanaivanahdft
andidft
to check the output of these functions – IvanaivanahDFT_SCALE
flag but with no sucess. If y try to pass the result of the dft to the idft, it's working fine. – Gorlinmin
,max
andtype
of your input (img
) and output (img_back
) – Ivanaivanah