Mathematica處理高斯光束的分佈圖像

通過Mathematica處理光斑圖像

1 讀圖並轉爲灰度格式

在Mathematica中,通過Import來打開文件,在記事本(.nb)文件中輸入命令後,摁下Shift+Enter可以實現命令的輸出。
通過Import命令打開的圖片爲rgb格式,爲了便於處理,我們通過ColorConvert將RGB圖片轉換爲灰度圖。

In[1]:= img = Import["E:\\Documents\\00\\1124\\1.bmp"]
In[2]:= ImageType[img](*返回img的數據類型,Mathematica中的註釋格式爲括號與型號*)
Out[2]=Byte
In[3]:= ImageValue[img,{1,1}](*輸出{11}點的像素值*)
Out[3]= {0.0117647, 0.0117647, 0.0117647}
In[4]:= ImageValue[img, {1, 1}, "Byte"](*以Byte格式輸出{11}點的像素值*)
Out[4]= {3, 3, 3}
In[5]:= grey = ColorConvert[img, "Grayscale"](*將圖片轉爲灰度格式*)
In[6]:= ImageValue[grey, {1, 1}]
Out[6]= 0.0117647

在這裏插入圖片描述

2 數據獲取與顯示

Mathematica讀取的圖像並不僅僅是圖像的數據,同時也包括圖像的其他信息,在Mathematica中,可以通過ImageData函數獲取圖像的數據。
對於已經轉爲灰度的圖像來說,其數據便是一個矩陣,在Mathematica中,可以通過ListPlot3D來繪製矩陣的三維圖。

In[7]:= imgData = ImageData[grey]
In[8]:= ListPlot3d[imgData]

其輸出圖像爲
在這裏插入圖片描述

3 數據截取

由於光斑只佔據整個圖像的一小部分,即對於我們來說,大部分的數據信息是不必要的,所以我們可以對圖像進行截取。在Mathematica中,可以直接通過MatrixPlot繪製僞彩色的矩陣圖。右鍵點擊矩陣圖,選擇獲取座標選項,即可實時反饋鼠標所在位置的矩陣座標。

In[9]:= MatrixPlot[imgData]

在這裏插入圖片描述
得到光斑左下角和右上角分別爲{350,229}和{426,300},在Mathematica中,通過[;;,;;]的格式來完成子矩陣的獲取。需要注意的是,郵件反饋的縱座標與座標軸標識的方向正好相反,所以在矩陣截取時需要注意座標的變換。

In[10]:= roi = imgData[[480 - 300 ;; 480 - 229, 350 ;; 426]];(*結尾加分號取消輸出*)
In[11]:= MatrixQ[roi](*判斷roi是否爲矩陣*)
Out[11]= True
In[12]:= MatrixPlot[roi]
In[13]:= ListPlot3d[roi]

在這裏插入圖片描述在這裏插入圖片描述

4 數據擬合

光斑在空間中呈e的負指數冪的形式從中間向兩邊衰減,我們可以通過選取光斑矩陣中每一列的最大值作爲有效值,對其進行高斯函數的擬合。

In[14]:= arr=Table[Max[roi[[i]], {i,Length[roi]}];
In[15]:= ListPlot[arr]

其中,Table[f(i),{i,N}]表示i從1循環至N這個過程中所對應的f(i)所組成的一個數組,Max爲選取數組中的最大值,Length爲返回數組長度;ListPlot爲繪製點集命令。其輸出圖像爲
在這裏插入圖片描述
在Mathematica中,數據擬合輸入的數據格式爲由{x,y}數對所組成的數組,所以需要建立擬合數據。最後,擬合函數爲NonLinearModelFit,其輸入參數分別爲擬合數據,函數表達式,函數參數以及自變量。

In[16]:= fitData = Table[{i,arr[[i]]},{i,Length[arr]}];
In[17]:= NonlinearModelFit[fitData, a Exp[-((x - b)/c)^2], {a, b, c}, x];
In[18]:= gauss["BestFitParameters"]
Out[18]= {a -> 0.231113, b -> 36.8372, c -> 19.1083}
In[19]:= gauss["ParameterTable"]

在輸入擬合函數之後,Mathematica的輸出形式爲
在這裏插入圖片描述
在輸入參數表之後,Mathematica的輸出爲:
在這裏插入圖片描述
最後,將所得函數與原數據畫在同一張圖上

In[20]:=p1 = Plot[gaussFunc, {x, 0, 100}];
		p2 = ListPlot[arr];
		Show[p1, p2]

最終得到
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章