報告之後:利用標準品做出更精確的光譜儀

0317033 謝明修

前情回顧:Final presentation imageJ簡介與應用

經過上次的報告之後,發現最大的問題是,沒有辦法將光譜準確的對應到波長。另外,如果直接用pixel插成波長,可能會導致失真,尤禎祥老師建議轉換成能量去做處理後,再轉換回波長,看能不能夠把波長校正回來。所以期末考完後,便慢慢著手進行修改,目前看起來結果還不錯,比原本的好多了!





一、加強手機光譜儀

為了固定每個光譜在圖片的位置是統一的,所以我把自製光譜儀黏上我的手機保護殼上,方便在後面處理。

二、已知波長的標準品測量

接下來,先拍攝三種已知波長標準品的樣本,分別是和生科系系辦借到的LIFE NO.3101紅光雷射筆(660nm)、尤禎祥老師提供的soease綠光雷射筆(532nm)和藍光DVD讀寫頭(405nm)。 註:除綠色雷射筆波長資訊從盒子上得到外,其他波長是從網路上得到的


三、imageJ前處理

先把所有樣品一次開啟後,imageJ>Image>Stacks>Images to stack 進行疊圖




之後用直線選取工具,選在同一個地方。並且把所有圖片,包括標準品和樣品都>Analyze>Plot profile後,資訊都存下來。(可惜有些樣品還是位置會跑掉)

660nm標準品

532nm標準品

405nm標準品

高壓鈉燈

我的檯燈(flouresenct lamp)

韋勳的檯燈(LED)

四、以matlab處理數據並繪圖

用兩種方式,一種是用倒數波長去處理的;一種是直接用波長和pixel去處理。

1.用倒數處理


    		WL405=importdata('D:\Desktop\計生實驗new final\value\紫光1.txt'); %匯入txt檔案
		WL532=importdata('D:\Desktop\計生實驗new final\value\綠光.txt'); %匯入txt檔案
		WL660=importdata('D:\Desktop\計生實驗new final\value\紅光.txt'); %匯入txt檔案
		[MAX_PIXEL_WL405 MAX_PIXEL_WL405INDEX]=max(WL405.data(:,2)); %找peak的pixel落在哪
		[MAX_PIXEL_WL532 MAX_PIXEL_WL532INDEX]=max(WL532.data(:,2));
		[MAX_PIXEL_WL660 MAX_PIXEL_WL660INDEX]=max(WL660.data(:,2));
		BG_interval=(MAX_PIXEL_WL532INDEX)-(MAX_PIXEL_WL405INDEX); %算出標準品中間的pixel差值
		RG_interval=(MAX_PIXEL_WL660INDEX)-(MAX_PIXEL_WL532INDEX);

		%把X軸用倒數處理標準品,中間用pixel數插值 
		X=[1/405+((1/405-1/532)*(MAX_PIXEL_WL405INDEX-1)/BG_interval):-(1/405-1/532)/BG_interval:1/405+((1/405-1/532)/BG_interval)
          	1/405:-(1/405-1/532)/BG_interval:1/532
             1/532-(1/532-1/660)/RG_interval:-(1/532-1/660)/RG_interval:1/660 
              1/660-(1/532-1/660)/RG_interval:-(1/532-1/660)/RG_interval:1/660-(1/532-1/660)*(length(WL660.data)-MAX_PIXEL_WL660INDEX)/RG_interval];
              
		NEW_X=1./X; %變回原本的波長

		SAMPLE=importdata('D:\Desktop\計生實驗new final\value\Values.txt'); %匯入txt檔案
		MAXdata=max(SAMPLE.data(:,2)); %抓出data亮度的最大值
		Y=SAMPLE.data(:,2)./MAXdata; %把Y變數設定為只有data的第二列(亮度部分)除以最大值以Normorlize
		plot(NEW_X,Y)
		xlabel('Wavelength(nm)')
		ylabel('Relative intensity')
		title('Visible spectrum of ')

2.用波長直接去處理 (其實只差在X軸)


    		WL405=importdata('D:\Desktop\計生實驗new final\value\紫光1.txt'); %匯入txt檔案
		WL532=importdata('D:\Desktop\計生實驗new final\value\綠光.txt'); %匯入txt檔案
		WL660=importdata('D:\Desktop\計生實驗new final\value\紅光.txt'); %匯入txt檔案
		[MAX_PIXEL_WL405 MAX_PIXEL_WL405INDEX]=max(WL405.data(:,2)); %找最大的pixel落在哪
		[MAX_PIXEL_WL532 MAX_PIXEL_WL532INDEX]=max(WL532.data(:,2));
		[MAX_PIXEL_WL660 MAX_PIXEL_WL660INDEX]=max(WL660.data(:,2));
		BG_interval=(MAX_PIXEL_WL532INDEX)-(MAX_PIXEL_WL405INDEX); %算出中間pixel的差值
		RG_interval=(MAX_PIXEL_WL660INDEX)-(MAX_PIXEL_WL532INDEX);

		X=[405-((532-405)*(MAX_PIXEL_WL405INDEX-1)/BG_interval):(532-405)/BG_interval:405-((532-405)/BG_interval) 
        405:(532-405)/BG_interval:532
        532+((660-532)/RG_interval):(660-532)/RG_interval:660
         660+((660-532)/RG_interval):(660-532)/RG_interval:660+(660-532)*(length(WL660.data)-MAX_PIXEL_WL660INDEX)/RG_interval];

		SAMPLE=importdata('D:\Desktop\計生實驗new final\value\Values.txt'); %匯入txt檔案
		MAXdata=max(SAMPLE.data(:,2)); %抓出data亮度的最大值
		Y=SAMPLE.data(:,2)./MAXdata; %把Y變數設定為只有data的第二列(亮度部分)除以最大值以Normorlize
		plot(X,Y)
		xlabel('Wavelength(nm)')
		ylabel('Relative intensity')
		title('Visible spectrum of ')

五、結果

標準品的重新輸出

紅色雷射筆 660nm


綠色雷射筆 532nm


藍光DVD發射頭 405nm






我的檯燈(Flourscent lamp)


直接用波長處理的:


網路上找到的:


圖片來源:wikipedia

韋勳的檯燈(LED)


直接用波長處理的:


網路上找到的:


圖片來源:點我

八舍外面的高壓鈉燈


直接用波長處理的:


疊圖,藍色的是直接用波長處理的,紅色的是用倒數做處理,和網路上找到的光譜圖對照後可發現,直接用波長處理比較符合。


網路上找到的:


圖片來源:wiki

六、Filter的使用

報告時,曲在雯老師建議,可以加high pass filter,讓peak看起來更明顯,在這裡,我使用signal processing toolbox中的Butterworth filter處理。

Code如下,
[b,a]=butter(Filter order, cutting frequency)


    [b,a]=butter(2, 0.09);
    output=filtfilt(b,a,Y);
    plot(X,output)
    

Filter order和cutting frequency是自己試出來的,看起來能消除最多雜peak的數字...,讓我們看一下高壓鈉燈的結果(紅色),藍色為原圖


七、討論及後記

可以看出,似乎沒有用倒數,直接用pixel處理好像比較符合正常情況。 另外紅光部分,不論是哪種處理方法,走樣都會較嚴重,是否是波長資料有誤,或是紅光區域的波長變化和pixel無關?(其實自己有偷偷試了一下,如果把紅光標準品訂在680nm,直接用波長對pixel值去做,跑出來的根本就和網路上查到的一模一樣!!!!)
看來...真正想要做出一個像樣的光譜儀真的沒那麼簡單!(好像在說廢話...不然真的分光光譜儀怎麼會那麼貴呢)

備註:曲老師也有提到,可以用matlab直接處理圖檔,不須經過imageJ,但是礙於本人matlab只是初學,找了資料仍然不知道該如何使用,便還是以imageJ處理了,若以後matlab技巧純熟,希望可以把整個程式更自動化





Back to my website