python學習暫停,解決主要矛盾 計算成像

2021-08-22 19:40:26 字數 4346 閱讀 1198

學習python乙個月後,實現了簡單的爬蟲、神經網路等簡單的專案,也初步見識到python的簡單和可讀性,但比較缺乏資料結構的知識,對於資料的操作的理解比較欠缺。然而,學習程式語言是為了解決問題,要麼解決現在手裡的問題,要麼找感興趣的問題去嘗試,但目前最緊要的問題是**,之前的工作都是基於matlab,改寫成python太浪費時間了,而且matlab 的矩陣運算速度確實很快,所以暫時還是先暫停學習python吧,先解決眼前的問題。

目前主要在關注計算成像方面的研究,可以說在硬體發展達到技術極限的時候,通過計算方法提高或實現成像能力的方法也就火了起來。計算成像根據目的可以分為以下幾種:

1.提高空間解析度,如多幀超分辨和結構光超分辨

2.在常規光學系統無法成像的情況下實現成像,如無透鏡成像、鬼成像、單畫素成像

3.提高時間解析度,如編碼超高速成像

4.實現三維成像,包括光譜維,如壓縮感知編碼孔徑光譜成像、層析光譜成像等

臨時總結分類,以後再具體進行分類。目前主要關注的內容是編碼孔徑光譜成像和無透鏡成像,我最開始接觸的是編碼孔徑光譜成像,然後是超分辨成像,最後才是無透鏡成像。由於實驗室內沒人做無透鏡成像,所以自己想把這個方向拿起來。然而在深入學習這個方向的過程中發現其實以上幾種計算成像的本質是一樣的,只是實現的形式不同,這個後面再詳細說。

先說說無透鏡成像,無透鏡成像最早的就是小孔成像,後來透鏡被發明以後,逐漸代替了小孔成像,但在高頻波長區域內,透鏡的作用太有限了,所以小孔成像仍然能夠發揮一定的作用。而小孔成像的解析度與小孔的大小有關係,小孔小了解析度高,但光通量小了,而且衍射現象的影響也變大。為了提高光通量,發明了編碼小孔成像。在這方面的文獻中學習到乙個模型,認為無透鏡成像模型的輸出可以用乙個卷積核與影象的卷積來表示,如果存在乙個線性運算元作用到卷積核上,形成乙個類似脈衝函式的函式,則可以實現影象重構。如果擴充套件一下,任何計算成像的模型都可以如此表示,只不過把卷積替換為變換,如傅利葉變換、radon變換、恒等變換等等。我目前接觸的都是線性變換,而且基本上都可以表達成y=ax的形式,當然根據計算量可以進行適當變形。那麼問題就歸結到如何準確求解方程組,這已經是非常常規的操作了。使用這種方法估計沒什麼新意,想到同事提到的用貝葉斯做超分辨的結果會比較好,可以嘗試一下,於是了解了一下貝葉斯。

現實是了解一下顯然是不夠的,看**裡的公式完全是頭大!怎麼辦,那只好從解決問題入手了,看看有沒有用貝葉斯求解線性方程組的呢?結果寥寥無幾。倒是有很多線性回歸的,那就好辦了,線性回歸和方程組本質是一樣的,只不過a和x的位置換一下,而且有現成的程式,可參考貝葉斯線性回歸,雖然沒看明白,但是應該是比較好的一篇部落格了吧。

把程式扒下來自己跑了一遍,更改一下樣本的數量,發現在樣本矩陣滿秩的時候,貝葉斯比最小二乘的結果要好很多,而方程越是病態,兩者的差距就很小了。由於沒有看懂貝葉斯,也就無法知悉其中的道理。

話說回來,無透鏡成像是可以看成是乙個可逆變換的,不像壓縮感知,因此利用貝葉斯也許能夠獲得比較好的結果。

拭目以待。

另外收集一些python的矩陣運算命令吧:python vs matlab,侵刪,感謝作者的總結

1.建立矩陣

a1=np.array([1,2,3],dtype=int)  

#建立乙個一維陣列,資料型別是int。也可以不指定資料型別,使用預設。幾乎所有的陣列建立函式都可以指定資料型別,即dtype的取值。

a2=np.array([[1,2,3],[2,3,4]])  

#建立乙個二維陣列。此處和matlab的二維陣列(矩陣)的建立有很大差別。

同樣,numpy中也有很多內建的特殊矩陣:

b1=np.zeros((2,3))  

#生成乙個2行3列的全0矩陣。注意,引數是乙個tuple:(2,3),所以有兩個括號。完整的形式為:zeros(shape,dtype=)。相同的結構,有ones()建立全1矩陣。empty()建立乙個空矩陣,使用記憶體中的隨機值來填充這個矩陣。

b2=identity(n)   #建立n*n的單位陣,這只能是乙個方陣。

b3=eye(n,m=none,k=0)  

#建立乙個對角線是1其餘值為0的矩陣,用k指定對角線的位置。m預設none。

此外,numpy中還提供了幾個like函式,即按照某乙個已知的陣列的規模(幾行幾列)建立同樣規模的特殊陣列。這樣的函式有zeros_like()、empty_like()、ones_like(),它們的引數均為如此形式:zeros_like(a,dtype=),其中,a是乙個已知的陣列。

c1=np.arange(2,3,0.1)  

#起點,終點,步長值。含起點值,不含終點值。

c2=np.linspace(1,4,10)  

#起點,終點,區間內點數。起點終點均包括在內。同理,有logspace()函式

d1=np.linalg.companion(a)  

#伴隨矩陣

d2=np.linalg.triu()/tril()  

#作用同matlab中的同名函式

e1=np.random.rand(3,2)  

#產生乙個3行2列的隨機數組。同一空間下,有randn()/randint()等多個隨機函式

fliplr()/flipud()/rot90()  

#功能類似matlab同名函式。

xx=np.roll(x,2)  

#roll()是迴圈移位函式。此呼叫表示向右迴圈移動2位。

2.陣列的特徵資訊

先假設已經存在乙個n維陣列x了,那麼可以得到x的一些屬性,這些屬性可以在輸入x和乙個.之後,按tab鍵檢視提示。這裡明顯看到了python物件導向的特徵。

x.flags    #陣列的儲存情況資訊。

x.shape  

#結果是乙個tuple,返回本陣列的行數、列數、……

x.ndim   #陣列的維數,結果是乙個數

x.size    #陣列中元素的數量

x.itemsize  

#陣列中的資料項的所佔記憶體空間大小

x.dtype    #資料型別

x.t   #如果x是矩陣,發揮的是x的轉置矩陣

x.trace()    #計算x的跡

np.linalg.det(a)   #返回的是矩陣a的行列式

np.linalg.norm(a,ord=none)  

#計算矩陣a的範數

np.linalg.eig(a)  

#矩陣a的特徵值和特徵向量

np.linalg.cond(a,p=none)  

#矩陣a的條件數

np.linalg.inv(a)  

#矩陣a的逆矩陣

3.矩陣分解

常見的矩陣分解函式,numpy.linalg均已經提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些演算法為了方便計算或者針對不同的特殊情況,還給出了多種呼叫形式,以便得到最佳結果。

4.矩陣運算

np.dot(a,b)用來計算陣列的點積;vdot(a,b)專門計算向量的點積,和dot()的區別在於對complex資料型別的處理不一樣;innner(a,b)用來計算內積;outer(a,b)計算外積。

專門處理矩陣的數學函式在numpy的子包linalg中定義。比如np.linalg.logm(a)計算矩陣a的對數。可見,這個處理和matlab是類似的,使用乙個m字尾表示是矩陣的運算。在這個空間內可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常規exp()對應有三種矩陣形式:expm()使用pade近似演算法、expm2()使用特徵值分析演算法、expm3()使用泰勒級數演算法。在numpy中,也有乙個計算矩陣的函式:funm(a,func)。

5.索引

numpy中的陣列索引形式和python是一致的。如:

x=np.arange(10)

print x[2]  

#單個元素,從前往後正向索引。注意下標是從0開始的。

print x[-2]  

#從後往前索引。最後乙個元素的下標是-1

print x[2:5]  

#多個元素,左閉右開,預設步長值是1

print x[:-7]  

#多個元素,從後向前,制定了結束的位置,使用預設步長值

print x[1:7:2]   #指定步長值

x.shape=(2,5)  

#x的shape屬性被重新賦值,要求就是元素個數不變。2*5=10

print x[1,3]  

#二維陣列索引單個元素,第2行第4列的那個元素

print x[0]   #第一行所有的元素

y=np.arange(35).reshape(5,7)  

#reshape()函式用於改變陣列的維度

print y[1:5:2,::2]  

#選擇二維陣列中的某些符合條件的元素

python學習筆記 字串及其主要的操作

a xiao b wang c a b print c 結果 xiaowanga xiao b wang d join a,b str方法 print d 結果xiao wangs1 you are print s1.count y 統計字母在字串中的出現頻率s1 you are print s1....

Python 深度學習 問題解決

本人學習中,持續更新各種問題 1.建議先檢視一下python2和python3的區別,參考別人的部落格 eclipse jee luna r win32 x86 64 python 安裝教程 直接預設路徑的話就是傻瓜無腦安裝了,就是最後執行下cmd命令 python就好了 eclipse 離線pyd...

python學習筆記 解決OC檔案重名衝突

本人用於解決動態庫第三方衝突,新增字首,防止類名重複 user bin python coding utf 8 import os import fileinput defprefixfiles path,prefix 修改當前目錄下全部檔案的字首 不包括子資料夾 list files os.lis...