Numpy和Tensorflow傅立葉變換示例:幅值和相位
一、numpy傅立葉變換和反變換
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('Set5/001_HR.png')
(r, g, b)=cv2.split(img)
img=cv2.merge([b,g,r])
#cv2.imshow("test",img)
#cv2.waitKey(0)
#plt.imshow(img)
#img = cv2.imread('flower.jpg',0) #直接讀為灰度影象
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#取絕對值:將複數變化成實數
#取對數的目的為了將資料變化到0-255
s1 = np.log(np.abs(fshift))
plt.subplot(221),plt.imshow(img),plt.title('original')
plt.xticks([]),plt.yticks([])
#---------------------------------------------
# 逆變換--取絕對值就是振幅
f1shift = np.fft.ifftshift(np.abs(fshift))
img_back = np.fft.ifft2(f1shift)
#出來的是複數,無法顯示
img_back = np.abs (img_back)
#調整大小範圍便於顯示
img_back = (img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
plt.subplot(222),plt.imshow(img_back,'gray'),plt.title('only Amplitude')
plt.xticks([]),plt.yticks([])
#---------------------------------------------
# 逆變換--取相位
f2shift = np.fft.ifftshift(np.angle(fshift))
img_back = np.fft.ifft2(f2shift)
#出來的是複數,無法顯示
img_back = np.abs(img_back)
#調整大小範圍便於顯示
img_back = (img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
plt.subplot(223),plt.imshow(img_back,'gray'),plt.title('only phase')
plt.xticks([]),plt.yticks([])
#---------------------------------------------
# 逆變換--將兩者合成看看
s1 = np.abs(fshift) #取振幅
s1_angle = np.angle(fshift) #取相位
s1_real = s1*np.cos(s1_angle) #取實部
s1_imag = s1*np.sin(s1_angle) #取虛部
s2 = np.zeros(img.shape,dtype=complex)
s2.real = np.array(s1_real) #重新賦值給s2
s2.imag = np.array(s1_imag)
f2shift = np.fft.ifftshift(s2) #對新的進行逆變換
img_back = np.fft.ifft2(f2shift)
#出來的是複數,無法顯示
img_back = np.abs(img_back)
#調整大小範圍便於顯示
img_back = (img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back))
plt.subplot(224),plt.imshow(img_back,'gray'),plt.title('another way')
plt.xticks([]),plt.yticks([])
plt.show()
二、tensorflow傅立葉變換示例:幅值和相位
#coding=utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from skimage import measure
from skimage import img_as_ubyte
# plt顯示fft的幅值圖
"""
img = cv2.imread('Set5/001_HR.png',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(f))
s2 = np.log(np.abs(fshift))
plt.subplot(121),plt.imshow(s1,'gray'),plt.title('original')
#plt.subplot(122),plt.imshow(s2,'gray'),plt.title('center')
sess = tf.InteractiveSession()
xs = tf.placeholder(dtype=tf.complex64,shape=(img.shape[0],img.shape[1]))
f1=tf.fft2d(xs)
f1_dis=f1.eval(feed_dict={xs:img})
f1shift = np.fft.fftshift(f1_dis)
ss1 = np.log(np.abs(f1_dis))
ss1 = np.float64(ss1)
plt.subplot(122),plt.imshow(ss1,'gray'),plt.title('fft_original')
plt.show()
"""
# plt顯示fft的相點陣圖
"""
Ihr = cv2.imread('Set5/003_HR.png',1)
Ilr = cv2.imread('Set5/003_EnhanceNet-PAT.png',1)
ph_out=[]
for i,img in enumerate([Ihr,Ilr]):
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#取絕對值:將複數變化成實數
#取對數的目的為了將資料變化到較小的範圍(比如0-255)
ph_f = np.angle(f)
ph_out.append(ph_f)
ph_fshift = np.angle(fshift)
index='22'+ str(i+1)
plt.subplot(int(index)),plt.imshow(ph_f,'gray'),plt.title('original')
#index = ['22' + str(i * 2 + 1), '22' + str(i * 2 + 2)]
#plt.subplot(int(index[0])),plt.imshow(ph_f,'gray'),plt.title('original')
#plt.subplot(int(index[1])),plt.imshow(ph_fshift,'gray'),plt.title('center')
shape = Ihr.shape
sess = tf.InteractiveSession()
xs = tf.placeholder(dtype=tf.complex64, shape=([2, shape[1], shape[0], shape[2]]))
fhr = tf.fft2d(xs[0])
flr = tf.fft2d(xs[1])
#fshift_hr, fshift_lr = np.fft.fftshift([fhr_dis,flr_dis])
ph_fhr = tf.cast(tf.angle(fhr),dtype=tf.float64)
ph_flr = tf.cast(tf.angle(flr),dtype=tf.float64)
#ph_fhr = tf.atan2(tf.imag(fhr),tf.real(fhr))
#ph_flr = tf.atan2(tf.imag(flr),tf.real(flr))
ph_fhr, ph_flr = sess.run([ph_fhr,ph_flr],feed_dict={xs:[Ihr, Ilr]})
print ("MSE of ph_fhr and ph_out[0]:",measure.compare_mse(ph_fhr,ph_out[0]))
print ("MSE of ph_fhr and ph_flr:",measure.compare_mse(ph_fhr,ph_flr))
plt.show()
"""
# plt顯示fft的賦值大小
"""
Ihr = cv2.imread('Set5/003_HR.png',1)
Ilr = cv2.imread('Set5/003_EnhanceNet-PAT.png',1)
nhr = np.fft.fft2(Ihr)
nlr = np.fft.fft2(Ilr)
amp_nhr = np.log(np.abs(nhr))
amp_nlr = np.log(np.abs(nlr))
shape = Ihr.shape
sess = tf.InteractiveSession()
xs = tf.placeholder(dtype=tf.complex64, shape=([2, shape[1], shape[0], shape[2]]))
fhr = tf.fft2d(xs[0])
flr = tf.fft2d(xs[1])
amp_fhr = tf.cast(tf.log(tf.abs(fhr)),dtype=tf.float64)
amp_flr = tf.cast(tf.log(tf.abs(flr)),dtype=tf.float64)
amp_fhr, amp_flr = sess.run([amp_fhr,amp_flr],feed_dict={xs:[Ihr, Ilr]})
print ("MSE of ph_fhr and ph_out[0]:",measure.compare_mse(amp_fhr,amp_flr))
"""
sess = tf.InteractiveSession()
theta0 = tf.atan2(1.0, 1.0) # pi/4
x0 = tf.constant(1.0)
y = tf.Variable(0.4)
c = tf.complex(x0, y)
c = tf.expand_dims(c,0)
c = tf.fft(c)
theta = tf.angle(c)
err = (theta - theta0)**2
optimize = tf.train.GradientDescentOptimizer(1e-1).minimize(err)
sess.run(tf.global_variables_initializer())
for i in range(10000):
sess.run(optimize)
if i % 10 == 0:
print(sess.run(c)) # should go to 1 + 1j
a=tf.constant(1e-8,tf.complex64,tf.shape())
三、numpy相位交換,幅值不變
import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage import measure
from skimage import img_as_ubyte
#img_flower = cv2.imread('Set5/001_HR.png',1) #直接讀為灰度影象
#img_man = cv2.imread('Set5/001_EnhanceNet-E.png',1) #直接讀為灰度影象
#img_man = cv2.imread('Set5/004_EnhanceNet-PAT.png',1) #直接讀為灰度影象
img_flower = cv2.imread('../../datasets/SuperResolution/EnhanceNet_Urban100/Urban100/039_HR.png',1) #直接讀為灰度影象
img_man = cv2.imread('../../datasets/SuperResolution/EnhanceNet_Urban100/Urban100/039_EnhanceNet-E.png',1) #直接讀為灰度影象
#img_man = cv2.imread('../../datasets/SuperResolution/EnhanceNet_BSD100\BSD100/043_EnhanceNet-PAT.png',1)
#cv2.imshow("test",img_flower)
#cv2.waitKey(0)
print ("PSNR of 0 and 1:",measure.compare_psnr(img_flower,img_man))
(r, g, b)=cv2.split(img_flower)
img_flower=cv2.merge([b,g,r])
(r, g, b)=cv2.split(img_man)
img_man=cv2.merge([b,g,r])
print ("PSNR of 0 and 1:",measure.compare_mse(img_flower,img_man))
plt.subplot(221),plt.imshow(img_flower,'gray'),plt.title('001_HR')
plt.xticks([]),plt.yticks([])
plt.subplot(222),plt.imshow(img_man,'gray'),plt.title('001_EnhanceNet-PAT')
plt.xticks([]),plt.yticks([])
#--------------------------------
f1 = np.fft.fft2(img_flower)
f1shift = np.fft.fftshift(f1)
f1_A = np.abs(f1shift) #取振幅
f1_P = np.angle(f1shift) #取相位
#--------------------------------
f2 = np.fft.fft2(img_man)
f2shift = np.fft.fftshift(f2)
f2_A = np.abs(f2shift) #取振幅
f2_P = np.angle(f2shift) #取相位
#---圖1的振幅--圖2的相位--------------------
img_new1_f = np.zeros(img_flower.shape,dtype=complex)
img1_real = f1_A*np.cos(f2_P) #取實部
img1_imag = f1_A*np.sin(f2_P) #取虛部
img_new1_f.real = np.array(img1_real)
img_new1_f.imag = np.array(img1_imag)
f3shift = np.fft.ifftshift(img_new1_f) #對新的進行逆變換
img_new1 = np.fft.ifft2(f3shift)
#出來的是複數,無法顯示
img_new1 = np.abs(img_new1)
#調整大小範圍便於顯示
img_new1 = (img_new1-np.amin(img_new1))/(np.amax(img_new1)-np.amin(img_new1))
plt.subplot(223),plt.imshow(img_new1,'gray'),plt.title('another way')
plt.xticks([]),plt.yticks([])
#---圖2的振幅--圖1的相位--------------------
img_new2_f = np.zeros(img_flower.shape,dtype=complex)
img2_real = f2_A*np.cos(f1_P) #取實部
img2_imag = f2_A*np.sin(f1_P) #取虛部
img_new2_f.real = np.array(img2_real)
img_new2_f.imag = np.array(img2_imag)
f4shift = np.fft.ifftshift(img_new2_f) #對新的進行逆變換
img_new2 = np.fft.ifft2(f4shift)
#出來的是複數,無法顯示
img_new2 = np.abs(img_new2)
#調整大小範圍便於顯示
img_new2 = (img_new2-np.amin(img_new2))/(np.amax(img_new2)-np.amin(img_new2))
plt.subplot(224),plt.imshow(img_as_ubyte(img_new2),'gray'),plt.title('another way')
plt.xticks([]),plt.yticks([])
plt._imsave("test.jpg",img_new2)
print ("PSNR of 0 and 4:",measure.compare_mse(img_flower,img_as_ubyte(img_new2)))
plt.show()
四、幾個簡單的畫圖函式:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
from PIL import Image
import matplotlib
import matplotlib.path as path
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.ticker import MultipleLocator
fig = plt.figure(figsize=(8,6), dpi=72,facecolor="white")
axes = plt.subplot(211, aspect=1, axisbelow=True)
lena = np.array(Image.open("output/001_HR.png"))
im = plt.imshow(lena, origin = 'upper', interpolation='nearest')
axes.set_xticks([])
axes.set_yticks([])
axes = plt.axes([0.05,0.00,0.40,0.50], frameon=False)
patch1 = patches.Circle((.5,.5), radius=.45, transform=axes.transAxes,
linewidth=2, facecolor='none', edgecolor='black',zorder=2)
patch2 = patches.Circle((.5,.5), radius=.46, transform=axes.transAxes,
linewidth=2, facecolor='white', edgecolor='white',zorder=1)
im = plt.imshow(lena[215:315,285:385], origin = 'upper', zorder=3,
interpolation='nearest', clip_path=patch1)
axes.set_xticks([])
axes.set_yticks([])
axes.add_patch(patch1)
axes.add_patch(patch2)
plt.show()
#coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
img001_HR = plt.imread('output/001_HR.png',0)
img001_En = plt.imread('output/001_EnhanceNet-PAT.png',0)
img002_HR = plt.imread('output/002_HR.png',0)
img002_En = plt.imread('output/002_EnhanceNet-PAT.png',0)
img003_HR = plt.imread('output/003_HR.png',0)
img003_En = plt.imread('output/003_EnhanceNet-PAT.png',0)
img004_HR = plt.imread('output/004_HR.png',0)
img004_En = plt.imread('output/004_EnhanceNet-PAT.png',0)
img005_HR = plt.imread('output/001_HR.png',0)
img005_En = plt.imread('output/001_EnhanceNet-PAT.png',0)
plt.subplot(521),plt.imshow(img001_HR,'gray'),plt.title('img001_HR')
plt.subplot(522),plt.imshow(img001_En,'gray'),plt.title('img001_En')
plt.subplot(523),plt.imshow(img002_HR,'gray'),plt.title('img002_HR')
plt.subplot(524),plt.imshow(img002_En,'gray'),plt.title('img002_En')
plt.subplot(525),plt.imshow(img003_HR,'gray'),plt.title('img003_HR')
plt.subplot(526),plt.imshow(img003_En,'gray'),plt.title('img003_En')
plt.subplot(527),plt.imshow(img004_HR,'gray'),plt.title('img004_HR')
plt.subplot(528),plt.imshow(img004_En,'gray'),plt.title('img004_En')
"""
plt.subplot(529),plt.imshow(img005_HR,'gray'),plt.title('img005_HR')
#plt.subplot(5210),plt.imshow(img005_En,'gray'),plt.title('img005_En')
"""
plt.show()
相關推薦
Numpy和Tensorflow傅立葉變換示例:幅值和相位
一、numpy傅立葉變換和反變換 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('Set5/001_HR.png') (r, g, b)=cv
分別用OpenCV-Python和Numpy實現傅立葉變換和逆傅立葉變換
Numpy實現 fft = np.fft.fft2(img) 將空間域轉化為頻率域 OpenCV實現 dft = cv2.dft(np.float32(img),flag=cv2.DFT_COMPLEX_OUTPUT) 這個函式與np.fft.fft2(img)實現相同的功能,但要注意先
離散傅立葉變換(DFT)和快速傅立葉變換(FFT)原理與實現
目錄 1、影象變換 2、離散傅立葉變換(Discrete Fourier Transform) 3、DFT性質 4、DFT與數字影象處理 5、FFT-快速傅立葉變換 6、DFT與FFT的演算法實現 1. 影象變換 — —數學領域中有很多種變換,如傅立葉變換、拉普拉斯變
簡述計算機三大變換的聯絡和區別 (傅立葉變換 拉普拉斯變換 z變換)
Q:簡述計算機三大變換的聯絡和區別 (傅立葉變換 拉普拉斯變換 z變換) (1) 傅立葉變換定義: 表示能將滿足一定條件的某個函式表示成三角函式(正弦和/或餘弦函式)或者它們的積分的線性組合。傅立葉變換是一種分析訊號的方法,它可分析訊號的成分,也可用這
numpy5傅立葉變換示例
目錄 介紹 定義 快速傅立葉變換模組(fft) 例項:音訊濾波 介紹 傅立葉這一張如果之後會用到,我會在進行擴充套件,這裡先講解最基本的用法。 定義 如我講解有問題:希望各位指出。 這裡有一個介紹傅立葉變
卷積和快速傅立葉變換(FFT)的實現
卷積運算 卷積可以說是影象處理中最基本的操作。線性濾波通過不同的卷積核,可以產生很多不同的效果。假如有一個要處理的二維影象,通過二維的濾波矩陣(卷積核),對於影象的每一個畫素點,計算它的領域畫素和濾波器矩陣的對應元素的乘積,然後累加,作為該畫素位置的值。關於影
傅立葉變換的意義和理解(通俗易懂)
這篇文章的核心思想就是:要讓讀者在不看任何數學公式的情況下理解傅立葉分析。 傅立葉分析不僅僅是一個數學工具,更是一種可以徹底顛覆一個人以前世界觀的思維模式。但不幸的是,傅立葉分析的公式看起來太複雜了,所以很多大一新生上來就懵圈並從此對它深惡痛絕。老實說,這麼有意思的東西居然成了大學裡的殺
真正理解傅立葉級數和傅立葉變換
真正理解傅立葉級數和傅立葉變換 記得上大學的時候的機械振動還有工程測試利用的傅立葉變化,當時感覺雲裡霧裡的,感覺好難,也就沒有去搞,渾水摸魚也就過來了,然後現在到了研究生階段,發現傅立葉變換呀,卷積呀非常的重要,也是學術研究最基礎的工具。在做人臉識別的時候剛好用上,所以靜下心
Python中使用numpy對序列進行離散傅立葉變換DFT
看了大佬對DFT的介紹後感覺離散傅立葉變換對序列訊號的處理還是很有用的, 總結下來就是DFT可以增加有限長序列的長度來提高物理解析度。 自己用python中的numpy庫實現了一下: 其中繪相簿的使用請參考:Python繪圖 將有效長度為4的單位序列,變換為長度16的DFT譜線。
【GCN】圖卷積網路初探——基於圖(Graph)的傅立葉變換和卷積
本文為從CNN到GCN的聯絡與區別——GCN從入門到精(fang)通(qi)的閱讀筆記,文中絕大部分公式和圖片摘自原文。 文章目錄 一、CNN(卷積神經網路)中的離散卷積 二、GCN基本概念介紹 (一)圖Grap
matlab進行傅立葉變換fft和shiftfft
使用matlab進行傅立葉變換 模擬訊號進行奈奎斯特取樣後成為離散的數字訊號,時域分析不太方便,通常要進行頻域變換更好的分析訊號,matlab中的fft和shiftfft兩個函式可以快速的幫助我們進行頻譜分析。兩個函式存在一些差別。 關於fft的預備知識: 由奈奎斯特取樣定理知,
《OpenCV3程式設計入門》——5.5.8 離散傅立葉變換綜合示例程式(附程式碼)
綜合《OpenCV3程式設計入門》——5.5 離散傅立葉變換原理和 《OpenCV3程式設計入門》——5.5.2 離散傅立葉變換相關函式詳解兩篇文章對離傅立葉變換的詳細介紹,本篇將展示實現離散傅立葉變化的示例程式(本篇所涉及的所有知識均在上述兩篇博文裡有詳細解釋,請參考): //--------
傅立葉變換 和 Gabor小波
1.傅立葉變換 1) 簡介 數字影象處理的方法主要分成兩大部分:空域分析法和頻域分析法。空域分析法就是對影象矩陣進行處理;頻域分析法是通過影象變換將影象從空域變換到頻域,從另外一個角度來分析影象的特徵並進行處理。頻域分析法在影象增強、影象復原、影象編碼壓縮及特徵編碼壓縮方
11.頻域裡的卷積——介紹,傅立葉變換和卷積,快速傅立葉變換(FFT)_1
目錄 介紹 FFT 介紹 我們將繼續討論頻率分析以及如何用頻率分量的概念來研究影象。如果你還記得上次我們講過的基於頻率的影象分解的概念。我們通過給你們看這張照片來回憶它(如圖)。這是著名的Dali圖片,當你在那裡允許高頻影象時,你會看到一個女人在欣賞地中海之類的東
傅立葉變換和拉普拉斯變換
尤拉公式 證明過程如下 首先是泰勒展開 參考cosX和sinX的泰勒展開可以證明這個問題。 還有下面這個號稱宇宙最美公式 “自然底數e,自然數1和0,虛數i還有圓周率pi,它是這麼簡潔,這麼美麗啊!” 傅立葉級數 傅立葉在提出傅立葉變換時,堅持認為任何一個週期訊號都可
Python中二維快速傅立葉變換----基於numpy庫
二維傅立葉變換在影象處理中經常用到,為了更好理解python中的fft2。這裡我們生成了二維正弦條紋,然後進行快速傅立葉變換。 #Python版本:Python3.5 #用到的庫:numpy,matploylib #作者:James_Ray_Murphy # -*- co
影象處理複習2——影象傅立葉變換和頻域濾波
影象處理複習 CH4 基本影象變換 4.1 DFT (1)一維DFT 一維DFT: F(u)=1N∑N−1x=0f(x)e−j2πuxN,x=0,1,…,N−1 其逆變換: f(x)=∑N−1u=0F(u)ej2πuxN,u=0,1
基於傅立葉變換和PyQt4開發一個簡單的頻率計數器
小學期的《訊號與系統》課,要求寫一個頻率計數器,下面是我個人理解的頻率計數 傅立葉變換的程式碼: # coding=utf-8 import numpy as np from scipy.io import wavfile import matplotlib.mlab as mlab import matp
OpenCV下利用傅立葉變換和逆變換實現影象卷積演算法,並附自己對於卷積核/模板核算子的理解!
學過訊號與系統的人都知道,卷積運算一般是轉化成頻率乘積再求逆來計算,因為這樣可以減少計算量,提高程式碼的效率。 影象卷積操作廣泛應用在影象濾波技術中。 影象卷積運算中一個重要概念是卷積核算子,它是模板核算子的一種,模板核算子實際上就是一個視窗矩陣,用這個視窗按畫素點滑動去
opencv官方示例-離散傅立葉變換dft()
//discrete fourier tranform, 離散傅立葉變換 //標頭檔案 #include "opencv2/core.hpp" //Core functionality,核心函式相關 #include "opencv2/imgpro