使用Python+OpenCV交換圖像的相位和幅度信息
爲了方便區分,我選擇在網上隨便選擇了一個獅子和豹子的圖片,根據上課所學,圖像的信息主要在相位中,所以預測結果是交換獅子和豹子的相位,纔會出現圖像內容的反轉,下面使用Python+OpneCV驗證。
1. 讀取圖像信息,對圖像進行標準化
這裏我們只提取灰度信息,所以OpencV的imgread的flags參數選擇0.其次,兩個圖像的信息可以交換必須保證圖像大小一致,這裏用resize把兩個圖像統一爲512*288大小。
import numpy as np
import cv2
# read image
figure1_filename = 'leopard.jpg'
figure2_filename = 'lion.jpg'
figure1 = cv2.imread(figure1_filename, 0)
figure2 = cv2.imread(figure2_filename, 0)
# Uniform image size
figure1 = cv2.resize(figure1, (512, 288))
figure2 = cv2.resize(figure2, (512, 288))
2. 快速傅里葉變換提取圖像幅度、相位信息
這裏用numpy的fft包,使用fft2快速傅里葉變換,會返回一個複數類型,用type函數提取到的類型爲<class ‘numpy.complex128’>
# Fourier transform
fft_fig1 = np.fft.fft2(figure1)
fft_fig2 = np.fft.fft2(figure2) # the result from is complex number <class 'numpy.complex128'>
numpy有angle和abs可以提取複數的相位、幅度信息
# Extract the amplitude phase information
fig1_amp = np.abs(fft_fig1)
fig1_pha = np.angle(fft_fig1)
fig2_amp = np.abs(fft_fig2)
fig2_pha = np.angle(fft_fig2)
3. 交換幅度信息
我們都知道歐拉公式
歐拉公式告訴了我們複數信息可以用sin和cos實現。幅度也好理解,對於虛數,其 幅值爲
有了這些,我們可以通過一下代碼交換幅度信息
# exchange amplitude
fig1_transform = fig2_amp*np.cos(fig1_pha) + fig2_amp*np.sin(fig1_pha)*1j
fig2_transform = fig1_amp*np.cos(fig2_pha) + fig1_amp*np.sin(fig2_pha)*1j
4. 傅里葉反變換,顯示結果
得到這樣一個複數的信息之後,我們要把頻域變換爲時域顯示,這裏仍然使用numpy的fft包,使用ifft2函數,最後一定的一定要用unit8類型強制轉換,因爲灰度圖像只能允許0~255的值存在。
# IFFT
fig1_Amp2_Pha1 = np.uint8(np.fft.ifft2(fig1_transform))
fig2_Amp1_Pha2 = np.uint8(np.fft.ifft2(fig2_transform))
# show
cv2.imshow('figure1_has_amp2', fig1_Amp2_Pha1)
cv2.imshow('figure2_has_amp1', fig2_Amp1_Pha2)
5. 交換相位
這類其實對步驟三稍微改一下就好了,剩下的都是重複的步驟
# exchange phase
fig1_transform_p = fig1_amp*np.cos(fig2_pha) + fig1_amp*np.sin(fig2_pha)*1j
fig2_transform_p = fig2_amp*np.cos(fig1_pha) + fig2_amp*np.sin(fig1_pha)*1j
# IFFT
fig1_Amp1_Pha2 = np.uint8(np.fft.ifft2(fig1_transform_p))
fig2_Amp2_Pha1 = np.uint8(np.fft.ifft2(fig2_transform_p))
# show
cv2.imshow('figure1_has_pha2', fig1_Amp1_Pha2)
cv2.imshow('figure2_has_pha1', fig2_Amp2_Pha1)
cv2.waitKey(0)
顯示結果
附上代碼下載地址:
https://download.csdn.net/download/qq_42635142/12502662