ImageJ開發教程——迴圈和儲存
最近有一個同學問我:
怎麼對100個圖片進行批次處理,然後將處理後的每一張照片儲存下來。
其實之前的一篇文章提到的
批處理(Batch Processing)
可以做到:
但批處理也有它自己的侷限性,比如程式碼的移植性較差,而且無法對圖片進行復雜處理等等。
這一篇就是要為大家介紹:
怎樣利用迴圈,進行更加靈活的批次處理和儲存。
設想這樣一個例子:你有100張(也可以是成千上萬)熒光照片待處理,你需要測得所有圖片的平均熒光強度,併為圖片新增偽彩並儲存起來。
怎麼透過程式碼實現呢?
先上程式碼:
這20行程式碼可以分為三大部分:
一、選擇處理和儲存資料夾(3-5行)
dir_saving = getDirectory(“Choose a Directory to save”);
dir_processing = getDirectory(“Choose a Directory to proess”);
這兩行程式碼用到了ImageJ自帶的一個重要的函式:
getDirectory("Choose a Directory")
該函式能開啟檔案選擇對話方塊,引號中的字元作為標題,並返回使用者選擇的目錄的路徑。
這裡選擇了處理和儲存的資料夾的路徑,將其賦予dir_processing、dir_saving這兩個變數。
list = getFileList(dir_processing);
這一行程式碼用到了
getFileList(directory)
這一函式,返回一個數組,其中包含指定目錄路徑中檔案的名稱。
二、迴圈遍歷(6-8行)
for(i = 0; i < list。length; i++)
{
open(list[i]);//Open each image
。。。
這裡用到了最常用的for迴圈結構:
for(initialization; condition; increment){
statement(s);
}
以及兩個內建函式
list.length,
返回了該資料夾中圖片的數量;
open(path)
會開啟對應地址的檔案。
將i初始值賦為0,如果i小於list.length(資料夾圖片中的數量),則進行該迴圈,迴圈結束後i加1,直到i大於list.length,即遍歷了該資料夾中所有的圖片。
三、圖片處理和儲存(9-18行)
//Measure the Fluorescence
run(“8-bit”);
setAutoThreshold(“Default dark”);
getThreshold(lower, upper);
setThreshold(lower, upper-1);
run(“Measure”);
//Add Fake Color
run(“Spectrum”);
saveAs(“tiff”, dir_saving + getTitle);
close();
第一部分的處理是透過調節閾值去掉比例尺,最終
檢測圖片的平均熒光強度
,在之前的文章有提到過,在這裡不再贅述:
第二部分是為圖片加上光譜樣式的偽彩,並將處理後的圖片進行儲存,這裡用到了一個重要的函式以及命名方法:
saveAs(format, path)
,該函式可以將開啟的圖片以指定的檔案格式,儲存到特定的位置,並命名,這裡我講圖片儲存為常見的tiff格式。
dir_saving是之前指定的資料夾儲存位置
,
getTitle
這一函式可以返回圖片的名稱,即用圖片原本的名稱對新影象進行命名,從而一一對應。
注意:不要忘了大括號和分號。
最終的效果如下,100張圖片幾秒鐘就處理完啦~
這篇文章的程式碼可以在GitHub下載到:
如果對於ImageJ使用有什麼問題可以私信我,或者給我發郵件:zhaoyc9@163。com
更多教程可以關注我的專欄:
希望對大家有幫助~