2019年2月5日

使用Imagej做影像分割的流程-使用PlantCV的流程教學

農業研究上,常常需要分析大量植物的表型,如果用傳統的個別測量方式,費時不少。因此目前已經有開發了自動機器人,固定為大量植栽攝影,而攝影所得的影像資料也是透過程式來加速處理影像分割和分析。這次介紹的網站裡的程式-PLANTCV就是一個用在此目的的PYTHON程式。
https://plantcv.readthedocs.io/en/latest/


我閱讀了其中流程的教學文件,覺得很實用,雖然是PYTHON的程式,不過影像分割的流程其實也能應用在imagej。因此本文就是將其Python流程轉換成Imagej流程的紀錄,如果是用imagej來處理大量影像資料,例如幾百張圖,那麼也只要把這些步驟錄製在macro裡再做修改就可以大量處理了。

以下是一些步驟的個別說明:

轉換色彩空間
以往我使用imagej做影像分割時,都是先用原始影像轉8 bits灰階,再用threshold或是原始彩色影像用color threshold來取得目標物。不過其實可以先將原始影像轉成HSV或是Lab的影像。因為有些目標物在RGB的channel之中未必會明顯突出,但是在HSV或是LAB影像中反而會變得明顯,因此轉成這類型影像後,再針對其中比較明顯的channel來做影像分割。
imagej的指令
Image/Type/RGB Stack
Image/Type/HSB Stack
Image/Type/Lab Stack


針對不同部位使用不同的影像空間的channel
由於植物並非色彩均質的物體,有些地方比較綠、有些地方黃甚至紅,因此可以使用不同色彩空間的channel來分割不同部位,最後再把這些組合在一起就可以。例如在Lab的色彩空間中,a channel是偏紅色綠色的,而b channel是偏藍色黃色的,所以就可以從這些部位個別取出要的部位再組合。


設定閾值做二值化影像
這部份就是直接設定Thershold,選擇要的部位來做二值化影像
imagej的指令
Image/Adjust/Threshold
Image/Adjust/Color Threshold




去除雜點、去噪
在二值化的影像中,難免會有一些噪點,可以使用中值濾波器,或是其他濾波器將雜點去除
imagej的指令
Process/Noise/Despeckle...
Process/Filters/Median..




影像邏輯運算
通常使用or運算做聯集,例如前述的過程得到一個以葉子為主的二值化影像,和一個以莖為主的二值化影像,接下來就可以用這兩個影像做聯集,也就是or運算,將兩個影像合併成一組。
imagej的指令
Process/Image Calculator


影像相減與相加
影像相減subtract,常用於減去背景,例如兩張圖片一張為沒有植株的盆栽,另一個是有植株的,兩者影像相減可得到植株的影像(但通常還需要再處理才能使用)
影像相加add,例如產生兩張圖,一張是邊緣強化的(透過sobel運算),另一張是增強對比的(經過laplace濾波),把兩張影像相加,可以得到兩者的優點,邊緣清楚且對比明顯
imagej的指令
Process/Image Calculator
Process/Find edge
Process/Enhance Contrast


從遮罩mask取得原圖目標物的選取區
例如有一個已經經過多次處理得到的二值化影像,在目標物的部份已經有了mask,可以將此mask轉成selection,再於原圖中套用此選取區
imagej的指令
Edit/Selection/Creation Selection(使用於二值化的影像,可得到選取區)
Edit/Selection/Restore selection(將其他影像的選取區套用於此)


以下用PlantCV的範例來做imagej的示範,共有兩個,並且用影片來說明。
---

---

流程:
1.原圖轉HSB --> 取得S channel影像 --> 設定閾值做二值化影像 --> 中值濾波去雜點  -->得到s_blu圖
2.原圖轉Lab --> 取得b channel影像 --> 設定閾值做二值化影像 --> 得到b圖
3.將s_blu圖和b圖做or運算,取得聯集後的影像,得到mask圖
4.將mask圖轉出選取區,套用在原圖上(或加入ROI manager)


第二個示範是紅外線攝影下的植物,有兩個影像,其中一個是有植物的,另一個是沒有植物的

--
--
流程:
1.原圖減去背景 -->  設定閾值做二值化影像  --->得到圖a
2.原圖做對比增強,利用laplace filter ,再用原圖減去這張圖,或是直接用Process/Enhance Contrast  --> 得到圖b
3.原圖做Find Edge尋找邊緣  --> 中值濾波  -->圖片反相 Edit/Invert   --> 得到圖c
4.圖b和圖c做add運算--> 設定閾值做二值化影像  ---> 侵蝕  --> 得到圖d
5.圖a和圖d做 or 運算 -->得到遮罩mask,再轉選取區套用在原圖上