2018年7月24日

Imagej配合Weka機器學習plugin做segmentation 偵測葉片氣孔位置 並裁切出單圖

這標題說得好複雜,希望一張圖就看懂在幹嘛。中間的圖是一張葉片下表皮經過表面精密翻模翻出來的照片(詳見樟樹葉的表面翻模與著色),旁邊的小圖是把個別氣孔裁切出來存出的小圖。即使照片裡有幾百幾千個氣孔,做好這件事也不用一分鐘,這就是這篇要做的事情。






所需要的工具就是fiji這個特別的imagej。
下載位置:https://fiji.sc/

它預載了Trainable Weka Segmentation這個plugin,我就是用這個plugin來偵測出氣孔位置。然後再用imagej的巨集(Macro),把偵測出的氣孔存成單張圖片。

整個流程我會用四部影片來說明:

機器學習的過程一看名字就覺得好複雜,但是透過這個plugin其實很簡單。就是你先教機器那個是保衛細胞,哪些是表皮細胞,然後訓練機器找出規則,讓它自己找出其他的保衛細胞,訓練好的分類器(Classifier),可以用在同類型的其他圖片上找氣孔。

第一部影片是針對單張圖片做分類器的訓練,第二部則是用多張圖片做成Stack,套用已經訓練的分類器直接找出氣孔。



第三部影片是利用分類器分類出來的圖片轉成ROI Manager的選取區,就可以在原圖上找到氣孔位置。這部影片會輪流示範單張圖片和多張圖片疊成的Stack要怎麼做這件事。

第四部影片是利用巨集來把單個氣孔裁切成單張圖,Macro是用來簡化重複工作的,首先利用record macro的方式找出每個滑鼠點擊的指令的文字命令是什麼,影片裡會教怎麼找,然後利用迴圈重複執行就可以。

影片中使用的Macro是這個,使用者要根據自己的狀況改一下檔名和存檔位置
for (i=0; i<roiManager("count"); ++i) {
    roiManager("Select", i);
    run("Duplicate...", "title=crop");
    run("Make Inverse");
    setForegroundColor(0, 0, 0);
    run("Fill", "slice");
    saveAs("Tiff", "rticle_"+(i+1)+".tif");
    close();
    //Next round!
    selectWindow("cell.jpg");
}





如果你有幾十張顯微照片,每張照片都有上千個氣孔,善用以上的流程,其實幾分鐘就可以做完這件事情了