2008年4月1日

用Imagej和試算表抓取不同時間點的位置

前一陣子幫學生做科展的分析,那學生做的是,某動物停留在不同色塊的選擇偏好,本來他的作法是觀察動物在何種色塊留下的痕跡最多,不過後來我建議他改用webcam監控攝影,每隔數分鐘拍下一張照片,之後再從照片中統計不同色塊的選擇次數。

本來這樣的方法用人工計算就可以了,不過當照片一多,人工計算就可能出錯。所以後來改用ImageJ加上試算表(例如MS Excel或OpenOffice.org calc)來做,速度快很多,以下就是作法。

基本概念和程序是這樣的:
1.定時攝影
2.使用ImageJ自動或人工捉取物體座標
3.在試算表利用函式將座標轉換成色塊名稱

首先是定時攝影,只要使用電腦加上webcam就可以達成了,軟體的部份如果是在linux環境下,可以用motion來做,在windows底下,大部分的軟體似乎都要錢,但後來在以前買的webecam附加軟體中,找到可以用的定時攝影軟體,問題算是解決了。

假設一分鐘拍攝一張,一天下來就有1440張,最好的情況是用ImageJ自動處理,不過可惜學生拍的照片因為亮度變化太大,所以我後來改用人工抓座標。如果要自動處理,可以用這篇文章提到的方式來做。

人工處理需要用到Manual Tracking這個plugin,下載之後放到Imagej的plugin資料夾就可以用了。

先開啟拍攝的照片

File > Import >Image Sequence...


選取第一張照片,按下OK就會出現下面這個視窗,直接按下OK就會把資料夾裡所以的照片通通都抓進ImageJ。

2


ImageJ會把所有照片匯成一個stack,這有點像是做成一個影片檔,不過實際上它只是一個具有多頁圖片的檔案。

再來就是到Plugin開啟Manual Tracking,因為我是把Manual Tracking放在Plugin中的Stacks資料夾,所以我得

Plugins > Stacks >Manual Tracking

出現這個視窗之後,按下Add track。
3

然後就把游標移到你開啟的圖片檔中,用滑鼠點擊那個物體的位置,程式會自動跳出Result視窗,告訴你該點的座標,然後圖片會自動跳到第二張,整個過程就像是在打地鼠一樣。
4

全部打完之後,把上面那個Result存檔

File > Save as...


如果是在windows底下執行,它會自動存成xls檔

現在來看那個xls檔中,在這檔案中,其實我們只需要X座標和Y座標,其他都可以刪掉。剩下就是寫一些簡單的函式。
1
我在H1到K5的這些儲存格紀錄的是各個色塊的邊緣座標,以green這個顏色來說,它的X座標是在73到195之間,Y座標在11到89之間,所以一個未知點的座標若位在這個範圍中,他就是屬於綠色。

D欄裡頭有函式,是用來分析該座標處在何種色塊。函式如下

=IF(AND(B2>$H$2;B2<$J$2;C2>$I$2;C2<$K$2);$L$2;
IF(AND(B2>$H$3;B2<$J$3;C2>$I$3;C2<$K$3);$L$3;
IF(AND(B2>$H$4;B2<$J$4;C2>$I$4;C2<$K$4);$L$4;
IF(AND(B2>$H$5;B2<$J$5;C2>$I$5;C2<$K$5);$L$5;"white"))))


M欄是用來統計D欄出現的顏色數目

=COUNTIF(D$1:D$65536;$L2)



雖然寫函式比較花時間,不過對於整體的資料分析時間,倒是幫助不少,本來需要十數分鐘的統計,現在只要二分鐘就可以完成。之後只要把座標貼到這個檔案裡,就能夠自動分析在各種色塊的停留數目。

不過這還有些缺憾,色塊的分析函式只能用在矩形上,如果是不規則形狀的色塊或圓形,不知道該怎麼寫函式?

未來的目標是在ImageJ寫個plugin,可以直接指定色塊範圍,然後自動或人工分析座標位置,自動產出統計資料,不需要用到試算表。不過現在對java還很陌生,要達到這一步,可能還有得等。