最近有一個同學問我:

怎麼對100個圖片進行批次處理,然後將處理後的每一張照片儲存下來。

其實之前的一篇文章提到的

批處理(Batch Processing)

可以做到:

但批處理也有它自己的侷限性,比如程式碼的移植性較差,而且無法對圖片進行復雜處理等等。

這一篇就是要為大家介紹:

怎樣利用迴圈,進行更加靈活的批次處理和儲存。

設想這樣一個例子:你有100張(也可以是成千上萬)熒光照片待處理,你需要測得所有圖片的平均熒光強度,併為圖片新增偽彩並儲存起來。

怎麼透過程式碼實現呢?

先上程式碼:

ImageJ開發教程——迴圈和儲存

這20行程式碼可以分為三大部分:

一、選擇處理和儲存資料夾(3-5行)

dir_saving = getDirectory(“Choose a Directory to save”);

dir_processing = getDirectory(“Choose a Directory to proess”);

這兩行程式碼用到了ImageJ自帶的一個重要的函式:

getDirectory("Choose a Directory")

該函式能開啟檔案選擇對話方塊,引號中的字元作為標題,並返回使用者選擇的目錄的路徑。

ImageJ開發教程——迴圈和儲存

這裡選擇了處理和儲存的資料夾的路徑,將其賦予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張圖片幾秒鐘就處理完啦~

ImageJ開發教程——迴圈和儲存

這篇文章的程式碼可以在GitHub下載到:

如果對於ImageJ使用有什麼問題可以私信我,或者給我發郵件:zhaoyc9@163。com

更多教程可以關注我的專欄:

希望對大家有幫助~