通過python處理光斑圖像
1 相關包與圖像讀取
首先需要科學計算必備包numpy
和畫圖包matplotlib.pyplot
,我們通過后者進行圖像數據的讀取.
plt.imread
讀取圖片之后為數據格式為numpy數組,可以通過成員函數astype
將整型數據變成浮點型,有利于后期處理。
plt.imshow
將img
的數據加載到窗口,plt.show()
顯示繪圖窗口,默認顯示為偽彩圖。
python自動畫出了偽彩圖,可以通過在plt.imshow
的過程中輸入cmap
參數使之得到灰度圖
>>> plt.imshow(img,cmap=plt.cm.gray) <matplotlib.image.AxesImage object at 0x000002E84F5B4788> >>> plt.show()
2 圖像截取
由于光斑只占據圖片中很小一部分,大量的冗余信息等同于噪聲,會對后期的數據處理造成影響,故需截取感興趣的區域,plt.ginput
函數提供一種交互操作方法,可返回鼠標點擊的位置,其輸入參數為選取點數,輸出為點擊的點的坐標。
>>> plt.imshow(img) <matplotlib.image.AxesImage object at 0x000002E857A21448> >>> plt.ginput(2) [(717.0757575757577, 299.8290043290042), (783.5692640692644, 233.33549783549768)]
在python中,通過方括號進行矩陣索引,圖片的截取方法為
>>> roi = img[233:299,717:783] >>> plt.imshow(roi) <matplotlib.image.AxesImage object at 0x000002E84F5B4948> >>> plt.show()
3顯示強度
為了更加直觀地反映光斑強度,以圖片行列為坐標,可以繪制3d強度圖。
繪制二維曲線,要求輸入相應的自變量和因變量,通過點和點的一一對應,畫出曲線。三維圖像繪制亦然,通過np.meshgrid
生成網格坐標,作為其 x , y x,y x,y向的自變量,其輸入參數為兩個一維數組,返回兩個二維數組,用以表示這兩個數組方向的坐標。
>>> xNum,yNum = roi.shape #獲取roi的維度 >>> xAxis,yAxis = np.meshgrid(range(yNum),range(xNum)) #range創建長度為xNum的自然數列 >>> ax = plt.gca(projection="3d") #建立3D坐標軸 >>> ax.plot_surface(xAxis,yAxis,roi) #創建面元圖 <mpl_toolkits.mplot3d.art3d.Poly3DCollection object at 0x0000019EAFF19D48> >>> plt.show()
結果為
4數據擬合
光斑在空間中的分布形式呈中心對稱的特征,故可抽取出其徑向坐標進行降維操作,考慮到數據的穩定性,并排除非信號區的影響,可提取每一列的最大值
>>> arr = np.max(roi,0) >>> x = np.arange(len(arr)) >>> plt.plot(x,arr) [<matplotlib.lines.Line2D object at 0x0000019EB469EB48>] >>> plt.show()
結果如圖所示
在python中,需要通過引入科學計算庫scipy
中的優化擬合包optimize
中的curve_fit
函數來進行數據的高斯擬合。curve_fit
的輸入參數為擬合函數,自變量和因變量;輸出參數為擬合函數中的其他參數以及擬合評價參數。
其中高斯函數的表達形式為
>>> from scipy.optimize import curve_fit >>> def gauss(x, a, b, c): ... return a*np.exp(-(x-b)**2/c**2) ... >>> abc, para = curve_fit(gauss,x,arr) >>> abc #即上式中的a,b,c array([89.72326971, 35.58522403, 20.86186403]) >>> fitValue = gauss(x,abc[0],abc[1],abc[2]) #擬合值 >>> plt.scatter(x,arr) #繪制原始數據的散點圖 <matplotlib.collections.PathCollection object at 0x0000019EB5438D88> >>> plt.plot(x,fitValue) #繪制擬合數據的曲線圖 [<matplotlib.lines.Line2D object at 0x0000019EB46D4048>] >>> plt.show()
問題
如果包沒有安裝的話,可以在命令行中用pip
文件進行安裝
> pip install numpy > pip install matplotlib > pip install scipy
以上就是Python光學仿真學習處理高斯光束分布圖像的詳細內容,更多關于Python處理高斯光束分布圖像的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/102943533