Пакетная обработка ImageJ - открытие серии изображений, содержащих определенное имя, и выполнение на них каких-либо задач - PullRequest
0 голосов
/ 04 октября 2019

У меня есть 25K TIF-файлов (пожалуйста, не спрашивайте, почему), которые я хочу организовать в стопки на изображении J. В основном для каждой интересующей области (ROI) есть 50 изображений, которые разбиваются на 25 z-плоскостей длядва канала. Я хочу все в одном стеке. И я хотел бы выполнить пакетную обработку всей папки, не открывая 50 изображений по 500 раз за раз. Я приложил изображение того, как выглядят имена файлов:

Организация папки

r01c01f01p01-ch1.tif - первые 10 символов являются уникальным идентификатором для каждой области интереса, затем номер плоскости (p01), затем канал - ch1 или ch2, затем расширение файла

Вот что у меня есть (что я собрал вместе на основе других макросов, так что это может не иметь смысла ...). использует язык макросов ImageJ.

//Processing loop to process each file in the folder.
for (i=0; i<list.length; i++) {
    showProgress(i+1, list.length);
    if (endsWith(list[i], ".tif")) { // skip the subfolder      (I create a subfolder earlier in the macros)    
        print("-- Processing file: " + list[i] + " --");
        open(dir+list[i]);
        imageTitle= getTitle();
        newTitle = substring(imageTitle, 0, lengthOf(imageTitle)-10); // r01c01f01p, cutting off plane number and then the rest to just get the ROI ID

        //This is where I'm stuck:
        // find all files containing newTitle and open them (which would be 50 at a time), then run the following macros on them

        run("Images to Stack", "name=Ch1 title=[] use");
        run("Duplicate...", "title=Ch2 duplicate");
        selectWindow("Ch1");
        run("Slice Remover", "first=1 last=50 increment=2");
        selectWindow("Ch2");
        run("Slice Remover", "first=2 last=50 increment=2");
        run("Merge Channels...", "c1=Ch1 c2=Ch2 create");
        saveAs("tiff", dirNew + newTitle + "_Stack.tif");
        //Close(All)? 
    }

}

print("-- Done --");
showStatus("Finished.");
setBatchMode(false); // Exit batch mode
run("Collect Garbage");

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Если я правильно понимаю, кажется, что вы могли бы преуспеть в том, чтобы сначала сложить по каналам, а затем объединить их. Я не уверен на 100%, но я думаю, что вы могли бы потенциально использовать макрос, который я уже создал, чтобы сделать это. Первоначально он предназначался для пакетной обработки терабайтов 5D-данных, поэтому он должен быть очень удобным для обработки вашего объема изображений. Это не совсем то, что вы ищете, но это должно быть очень легко изменить (я немного переборщил с комментариями в коде), и я думаю, что единственное, что он делает, это то, что вы, скорее всего, не хотите, это производить максимум проектов извходы. Я скину сюда ссылку и поищу ваш ответ. Если это интересно, дайте мне знать, и мы сможем совместить его с вашими потребностями :-) В противном случае, если бы вы могли предоставить немного больше информации о том, где вы застряли и / или где меня неправильно поняли, я будусделайте все возможное, чтобы помочь!

https://github.com/evanjkiely/FIJIMacros

0 голосов
/ 04 октября 2019

Вы можете сделать что-то вроде:

for (plane=1; plane<51; plane++) {

  open(newTitle+plane+"-ch1.tif");
  open(newTitle+place+"-ch2.tif");
}

Что позаботится об открытии. Я был бы склонен иметь цикл до этого, который бы сопоставлял количество уникальных "newTitle", поскольку ваша текущая настройка в конечном итоге будет делать что-то вроде открытия первого элемента, сборки объединенного TIF-файла, а затем повторения процесса 25K. раз, если я правильно понимаю.

Учитывая, что вы знаете количество уникальных значений "r01c01f01p", в принципе вы можете сделать набор стековых циклов, схожих с:

newTitleArray = newArray();

for (r=1; r<50; r++) {
  titleBit = "r0" + toString(r);

  for (c=1; c<501; c++) {
    titleBit = titleBit + "f0"...

В качестве альтернативы,Вы можете настроить цикл, в котором вы проверяете уникальные значения "r01c01f01p" и добавляете их в массив. В любом случае вы должны заменить цикл for "list" на цикл for "newTitleArray", а затем перейти к открывателю, который я перечислил выше, вместо существующего.

...