В следующем коде у меня есть функция, которая возвращает изображение, обрезанное по центру круга определенного радиуса. Затем я выполняю преобразование Фурье изображения и снова обращаюсь к преобразованию Фурье, чтобы восстановить изображение, которое работает нормально.
Затем я рассчитал, что центрированный круг с радиусом 43 энергетического спектра ( исключено здесь) даст 99% энергии исходного изображения. Но когда я пытаюсь применить свою функцию «imgRadius» к амплитудному спектру (изображение, преобразованное Фурье), а затем выполнить обратное преобразование Фурье для этого изображения, я получаю это странное переворачивание исходного изображения вверх ногами *. 1003 *
def imgRadius(img, radius):
result = np.zeros(img.shape,np.float64)
centerX = (img.shape[0])/2
centerY = (img.shape[1])/2
for m in range(img.shape[0]):
for n in range(img.shape[1]):
if math.sqrt((m-centerX)**2+(n-centerY)**2) < radius:
result[m,n] = img[m,n]
return result
imgpath = directory+"NorbertWiener.JPG"
img = cv.imread(imgpath, cv.IMREAD_GRAYSCALE)
norm_image = cv.normalize(img, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
amp = (np.fft.fftshift(np.fft.fft2(norm_image)))
amp_log = np.log(np.abs(amp))
norm_amp = cv.normalize(amp_log, None, alpha=0, beta=1, norm_type=cv.NORM_MINMAX, dtype=cv.CV_32F)
restoredAMP = np.abs(np.fft.ifft2(np.fft.ifftshift(amp)))
radamp = imgRadius(norm_amp,43)
rest99 = np.abs(np.fft.ifft2((imgRadius(amp,43))))
plt.subplot(231),plt.imshow(norm_image, "gray", vmin=0, vmax=1),plt.title('Image')
plt.xticks([]), plt.yticks([])
plt.subplot(232),plt.imshow(norm_amp, "gray", vmin=0, vmax=1),plt.title('Amplitude')
plt.xticks([]), plt.yticks([])
plt.subplot(233),plt.imshow(restoredAMP, "gray", vmin=0, vmax=1),plt.title('Restored from amplitude')
plt.xticks([]), plt.yticks([])
plt.subplot(235),plt.imshow(rest99, "gray", vmin=0, vmax=1),plt.title('Restored from r=43')
plt.xticks([]), plt.yticks([])
plt.subplot(234),plt.imshow(radamp, "gray", vmin=0, vmax=1),plt.title('Amplitude r=43')
plt.xticks([]), plt.yticks([])
plt.show()
Это как-то связано с тем, что я использую абсолютные значения? Я не понимаю, как мне удастся построить изображение, не избавляясь от мнимых частей изображений, но я вижу, как, возможно, некоторая информация теряется в обратном FFT.
Я просто не Не понимаю, почему у меня не возникает проблем при выполнении IFFT для исходного спектра амплитуд.