來自網友的這個提問,其實目的是要做細胞追蹤,要處理的是細胞分裂的影片。希望能將A細胞在每個影格都能定位出來,網友也提供了判斷邏輯。將第一影格的A細胞和第二影格的兩個細胞都做交集處理,看看和第二影格的哪個細胞交集的比較多,就可以找到第二影格的A細胞在哪。
由於之前沒有寫過類似的Macro,所以也看了幾次說明文件,還參考了其他人寫的Macro,總算是寫出來了。要處理這個問題之前,其實得先把細胞切割好,還好網友已經先切好了給我處理。
影片中用的Macro我貼在本文最後,使用前提是要用wand tool先點選一個細胞,加入ROI Manager之後,再去執行Macro。
雖然網友已經提供給我切割好的細胞輪廓,不過我也還是手癢想處理看看這個影片,想說有沒有辦法可以把細胞切割好,不過我試了好幾個方法都切不好。最後只好用半自動的方法來做。
方法是先手動在細胞分界處劃線,存成ROI,再用這個ROI去切割開細胞。具體的作法就看影片囉
*********************************
setBatchMode(true);
setAutoThreshold("Default");
width = getWidth;
height = getHeight;
n = getSliceNumber();
for (i=n; i<=nSlices-1; i++) {
//for (i=n; i<=n; i++) {
print("==========");
print("i=",i);
roiMan_n = roiManager("count");
print("roiMan_n=",roiMan_n);
run("Select None");
setSlice(i+1);
run("Analyze Particles...", "display add slice");
roiMan_n_new = roiManager("count");
print("roiMan_n_new=",roiMan_n_new);
//計算下一張Slice增加了多少個ROI
roi_add = roiMan_n_new - roiMan_n ;
print("roi_add=",roi_add);
roiManager("Show None");
AND_Big_area= 0; //預設取交集後的面積為零
AND_Big_area_n = 0 ;//預設取交集後的面積,最大的是第零個
for (j=1; j<=roi_add; j++) {
roiManager("Select", newArray(roiMan_n-1,roiMan_n-1+j));
roiManager("AND");
getStatistics(area);
print("j=",j,",area=",area);
//沒交集的面積會回報成整張圖片的面積,所以將回報面積設為0
if(area == width * height){
area =0;
}
if(area>AND_Big_area){
AND_Big_area = area;
AND_Big_area_n = j;
}
}
print("Big=",AND_Big_area_n);
print("AND_Big_area=",AND_Big_area);
//select biggest area and add the new ROI in the next slice
roiManager("Select", roiMan_n -1 + AND_Big_area_n);
roiManager("Add");
//delete all new ROI in the next slice
for (j=1; j<=roi_add; j++) {
roiManager("Select", roiMan_n-1+1);
roiManager("Delete");
}
}
resetThreshold();
setBatchMode(false);