通過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}](*輸出{1,1}點的像素值*)
Out[3]= {0.0117647, 0.0117647, 0.0117647}
In[4]:= ImageValue[img, {1, 1}, "Byte"](*以Byte格式輸出{1,1}點的像素值*)
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]
最終得到