2019年8月1日

用Imagej做顯微追焦

顯微追焦是什麼?其實我也沒想過要怎麼去命名這種影片。我用以下的影片來說明好了,它就是把在顯微影片下,本來四處跑來跑去的生物,用影像處理讓它固定在同一個地方,甚至身體方向也固定下來。這跟攝影的追焦有點像啦,所以就叫顯微追焦囉。
處理成這樣的影片有什麼好處呢?我實作的結果,發現這樣更能夠更仔細看到這些生物的細節,或是運動方式。如果是原先到處跑的影片,你又要追它的位置,又要看清楚,那就實在太累了。



處理的流程是先標記生物的位置,然後用程式碼位移每個影格,讓標記的位置都放在同一個地方,然後你就可以裁切獲得追焦後的影像。
這系列的教學影片共有四集,會用到兩種簡單的程式碼,分別是「用點標記」和「用線標記」的兩種。程式我就貼在文章最底下
要使用這些程式,就只要在Imagej中開啟File/New/Text Window
把以下的程式按照需求貼在那window就好了(要確認功能表上的Language,看一下勾選IJM喔)。











=====用點標記的======
origin_x= getWidth/2;
origin_y= getHeight/2;
for (i = 0; i <  nResults ; i++) {
slice_x = getResult("X", i);
slice_y = getResult("Y", i);

translate_x= origin_x-slice_x;
translate_y= origin_y-slice_y;

setSlice(getResult("Slice", i));
run("Translate...", "x="+translate_x+" y="+translate_y+" interpolation=None slice");
}

====用線標記的=========
origin_x= getWidth/2;
origin_y= getHeight/2;
for (i = 0; i <  nResults ; i++) {
BX =  getResult("BX", i);
BY =  getResult("BY", i);
W =  getResult("Width", i);
H =  getResult("Height", i);
A = getResult("Angle", i);

if(A>-180 && A<=-90){
X=BX+W;
Y=BY;
}
if(A>-90 && A<=0){
X=BX;
Y=BY;
}
if(A>0 && A<=90){
X=BX;
Y=BY+H;
}
if(A>90 && A<=180){
X=BX+W;
Y=BY+H;
}


translate_x= origin_x-X;
translate_y= origin_y-Y;
rotate_A = A + 90;
setSlice(getResult("Slice", i));
run("Translate...", "x="+translate_x+" y="+translate_y+" interpolation=None slice");
run("Rotate... ", "angle="+ rotate_A +" grid=1 interpolation=Bilinear");
}
==============