Фиджи Макрос для пакетной обработки изображений .nd2

Может ли кто-нибудь сказать мне, почему с помощью этого макроса я просто получаю на выходе для каждого канала каждого изображения файл .png первого фрагмента изображения, а не составного изображения? Похоже, часть кода Z-проекта работает неправильно, заранее спасибо!!

`// Function to process each .nd2 file
function processFile(filePath) {
    // Open the .nd2 file
    setBatchMode(true);
    open(filePath);
    // Get the title of the opened image
    title = getTitle();
    
    // Stack different focal planes into one high projection image per channel
    run("Split Channels");
    channelTitles = getList("image.titles");

    // Process each channel
    for (c = 0; c < channelTitles.length; c++) {
        selectWindow(channelTitles[c]);
         // Get the total number of slices
        totalSlices = getSliceNumber();

        // Use all slices for Z Projection
        run("Z Project...", start=1 stop=totalSlices, " projection=[Max Intensity]");
        run("Update");
        projTitle = getTitle();
        close(channelTitles[c]);
        selectWindow(projTitle);
        // Adjust brightness and contrast automatically
        run("Enhance Contrast", "saturated=0.35");
        run("Update")
        run("Apply LUT", "stack");
        
        // Convert to RGB
        run("RGB Color");
        
        // Save the processed channel
        saveAs("Tiff", filePath + "_channel" + (c + 1) + ".tif");
        close();
    }
    
    // Close the original image
    close(title);
}`

Я попытался поработать над следующей частью кода, выбрав изображение проекта после создания и закрыв исходное, но оно все еще не работает....

// Use all slices for Z Projection
        run("Z Project...", start=1 stop=totalSlices, " projection=[Max Intensity]");
        run("Update");
        projTitle = getTitle();
        close(channelTitles[c]);
        selectWindow(projTitle);

Это пример того, как это должно выглядеть, если я проделаю те же отрывки, которые указаны в коде на Фиджи, непосредственно на каждом изображении

Вот что я получаю после всех ваших попыток и предложений

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

Herbie 08.08.2024 15:30

Дорогой @Herbie, я начинаю с изображений .nd2, полученных на конфокальном микроскопе, у меня есть разные каналы, и для каждого из них я хочу сложить (метод проекции Макса) и настроить яркость/контраст, чтобы получить файл .png. Я запускаю конвейер как макрос при пакетной обработке Фиджи... есть ли у вас какие-либо предположения, что происходит не так?

DGM 09.08.2024 11:24

Для каждого цветового канала вы хотите сделать максимальную z-проекцию? (Вы пишете: «Я хочу сложить [метод максимальной проекции], но максимальная проекция дает вам одно изображение, а не стопку. Пожалуйста, поймите, что нам нужно точное описание !) Конечно, у меня есть предложения, но я не буду беспокоиться о вашем коде, а напишу его самостоятельно. Не могли бы вы предоставить небольшой образец ваших данных .nd2, возможно, через службу, похожую на Dropbox?

Herbie 09.08.2024 12:07

Прежде чем мы начнем с кодирования, хотелось бы узнать, как импортировать файлы .nd2 в ImageJ? Я бы импортировал их с помощью импортера BioFormats с галочкой разделенных каналов, чтобы вы получали отдельные стеки для цветов. Это, конечно, можно сделать с помощью вызова макроса.

Herbie 09.08.2024 12:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Синтаксис этой строки:

run("Z Project...", start=1 stop=totalSlices, " projection=[Max Intensity]");

неверно.

Если вы это сделаете:

run("Z Project...", "projection=[Max Intensity]");

он должен работать нормально. По умолчанию начинается с 1 и заканчивается на последнем срезе, поэтому это будет работать.

Чтобы исправить исходную строку (и понять, почему она не работает), вам нужно будет сделать:

run("Z Project...", "start=1 stop = " + totalSlices + " projection=[Max Intensity]");

Вам нужно создать строку в качестве аргумента, чего не было в исходном коде. Однако существует дополнительная проблема: переменная totalSlices определяется как getSliceNumber(), которая представляет собой номер текущего среза (1), а не общее количество срезов. Вот почему код не работает.

Правильный код должен быть:

// Function to process each .nd2 file
function processFile(filePath) {
    // Open the .nd2 file
    setBatchMode(true);
    open(filePath);
    // Get the title of the opened image
    title = getTitle();
    
    // Stack different focal planes into one high projection image per channel
    run("Split Channels");
    channelTitles = getList("image.titles");

    // Process each channel
    for (c = 0; c < channelTitles.length; c++) {
        selectWindow(channelTitles[c]);
        // Use all slices for Z Projection
        run("Z Project...", "projection=[Max Intensity]");
        projTitle = getTitle();
        close(channelTitles[c]);
        selectWindow(projTitle);
        // Adjust brightness and contrast automatically
        run("Enhance Contrast", "saturated=0.35");
        run("Apply LUT", "stack");
        
        // Convert to RGB
        run("RGB Color");
        
        // Save the processed channel
        saveAs("Tiff", filePath + "_channel" + (c + 1) + ".tif");
        close();
    }
    
    // Close the original image
    close(title);
}

Кроме того, импортер биоформатов должен быть настроен так, чтобы открытие каждого файла .nd2 не запускало диалоговое окно импорта.

Спасибо @quantixed! Я пытался исправить эту строку кода, но все равно получаю результат (изображение .png после запуска пакетной обработки нескольких файлов .nd2 в указанной входной папке), это похоже на первый Z-стек каждого канала, а не на сложенный проекция. Я тестировал разные попытки и сценарии, которые нашел в Интернете, но ни одна из них не сработала, есть идеи?

DGM 08.08.2024 18:54

Не могли бы вы ответить на мой запрос выше? Если мы не знаем точно, какие изображения или стопки вы хотите обрабатывать, как и с каким именно результатом, мы не сможем помочь.

Herbie 08.08.2024 19:19

Я отредактировал свой ответ выше, чтобы объяснить, почему я думаю, что вы все еще не получаете желаемого результата. Вызовы run("Update"); также не нужны и вызывают ошибку при запуске кода. Если вы перейдете на предложенное мной изменение run("Z Project...", "projection=[Max Intensity]"); думаю, оно сработает.

quantixed 09.08.2024 08:44

@quantixed Я протестировал новый код, изменив его, как вы предложили, но, похоже, он все еще не работает... Я добавил пример изображений, которые я получаю с помощью конвейера, или выполняю ту же процедуру непосредственно на Фиджи для каждого изображения (см. изображения вопросов, которые я прикрепил, чтобы было более понятно)....

DGM 09.08.2024 11:21

Я снова отредактировал свой ответ. На этот раз он показывает полную функцию. Я проверил, что он работает с 3-канальным z-стеком в формате nd2. Возможно, внесенные вами изменения не отражали то, что я предлагал.

quantixed 09.08.2024 12:54

Поэтому, если я скопирую и вставлю последнюю версию вашего кода @quantixed, моя проблема все равно останется, каким-то образом не работает сложение Z фокальных плоскостей, и я могу увидеть это, сохранив файл .tif, который показывается мне, когда я открываю его каждый раз. фокальная плоскость изображения для каждого канала в одном файле. Я не знаю, почему у тебя это работает, а у меня нет.

DGM 09.08.2024 14:11
Ответ принят как подходящий

Ниже вы найдете демонстрационный макрос ImageJ, в котором используется файл «.nd2», который я нашел здесь. Пожалуйста, загрузите этот raw-файл и попробуйте макрос с этим файлом! В файле показаны два цветовых канала с четырьмя изображениями (здесь: моменты времени).

//imagej-macro "nd2-processing" (Herbie G., 09. Aug. 2024)
requires("1.54j");
path=File.openDialog("Open the sample nd2-file");
run("Bio-Formats","open=[path] color_mode=Default rois_import=[ROI manager] split_channels view=Hyperstack stack_order=XYCZT use_virtual_stack series_1");
path=File.getDirectory(path)+File.nameWithoutExtension;
clr=newArray("Blue","Green","Red");
n=nImages;
for (i=0;i<n;i++) {
   run("Z Project...","projection=[Max Intensity]");
   run("Enhance Contrast...","saturated=0.35");
   run(clr[i]);
   saveAs("PNG",path+"_ch-"+(n-i)+".png");
   close(); close();
}
exit();
//imagej-macro "nd2-processing" (Herbie G., 09. Aug. 2024)

Обратите внимание, что при назначении LUT проекционным изображениям они сохраняются с глубиной 8 бит. Сохраните в формате TIF, чтобы сохранить глубину 16 бит. ===========================================

Наконец, ниже вы найдете код для пакетной обработки всех файлов «.nd2» в папке:

//imagej-macro "batch_nd2-processing" (Herbie G., 09. Aug. 2024)
requires("1.54j");
close("*");
inSfx=0;   // preferred source file suffix
outSfx=2; // preferred result file suffix
Dialog.create("Batch Process Folder");
   suffix=newArray(".nd2",".bmp",".png",".tif");
   Dialog.setInsets(0,200,0);
   Dialog.addMessage("Macro does not process nested folders!",12,"blue");
   Dialog.setInsets(6,0,0);
   Dialog.addChoice("Suffix",suffix,suffix[inSfx]);   
   Dialog.setInsets(-28,182,0);
   Dialog.addMessage("of the source files");   
   Dialog.addDirectory("Source-Folder",getDir("file"));
   Dialog.addChoice("Suffix",suffix,suffix[outSfx]);   
   Dialog.setInsets(-37,182,0);
   Dialog.addMessage("for the result files");  
   Dialog.addDirectory("Result-Folder",getDir("file"));
Dialog.show();
sfx1=Dialog.getChoice();
srce=Dialog.getString();
sfx2=Dialog.getChoice();
dest=Dialog.getString();
setBatchMode(true);
count=processFolder(sfx1,srce,sfx2,dest);
setBatchMode(false);
exit(""+count+" files processed");
//
function processFolder(xtn1,dir1,xtn2,dir2) {
   color=newArray("Blue","Green","Red");
   cnt=0;
   list=getFileList(dir1);
   n=list.length;
   for (i=0;i<n;i++)
      if (endsWith(list[i],xtn1)) {
         cnt++;
         path=dir1+list[i];
         run("Bio-Formats","open=[path] color_mode=Default split_channels view=Hyperstack stack_order=XYCZT use_virtual_stack series_1");
         path=dir2+File.nameWithoutExtension;
         processInput(path,xtn2,color);
      }
   return cnt;
}
function processInput(pth,xtn,clr) {
   n=nImages;
   for (i=0;i<n;i++) {
      run("Z Project...","projection=[Max Intensity]");
      run("Enhance Contrast...","saturated=0.35");
      run(clr[i]);
      saveAs(pth+"_ch-"+(n-i)+xtn);
      close(); close();
   }
}
//imagej-macro "batch_nd2-processing" (Herbie G., 09. Aug. 2024)

Предполагается, что исходные стеки имеют максимум три цветовых канала!

Кажется, что этот код, по крайней мере, правильно создает Z-стек, однако у меня возникают проблемы с сохранением сгенерированного файла .png, кроме того, Фиджи каждый раз просит меня выбрать каждый файл .nd2 индивидуально, как я могу настроить его в цикле для пакетная обработка всех файлов в папке? Заранее спасибо!

DGM 09.08.2024 14:14

«проблемы с сохранением созданного файла .png»; Пожалуйста, скажите мне, что это значит. Мой макрос сохраняет PNG-файлы в тот же каталог, из которого взяты стопки. Для пакетной обработки вам необходимо вызвать основные части моего макроса из цикла. В опубликованном вами коде этот цикл не показан, поэтому я предположил, что вы знаете, как это сделать. Действительно сложно помочь, если вовремя не предоставить необходимую информацию.

Herbie 09.08.2024 14:20

Я имею в виду, что когда я запустил макрос, Фиджи показывает ошибку, из-за которой не удается сохранить файл .png, поскольку он не находит путь (хотя я указал его так же, как вы в своем макросе). Может быть, вы можете написать здесь точный код, который должен работать, если я скопирую и вставлю его в Фиджи -> процесс -> пакет -> макрос? возможно, так мне будет яснее, что именно мне следует ему сказать, чтобы все заработало. Заранее спасибо!

DGM 09.08.2024 14:48

Извините, но мой опубликованный код работает, как описано, то есть правильно сохраняет PNG-файл. У меня нет опыта работы с «Фиджи -> процесс -> пакет -> макрос», потому что я всегда кодирую внешний пакетный цикл в соответствии с этим примером кода «Справка >> Примеры >> Макрос >> Папка процесса».

Herbie 09.08.2024 15:24

Дорогой @Herbie, спасибо! Теперь все работает правильно!!

DGM 09.08.2024 16:44

Пожалуйста, проверьте мой предыдущий ответ, который теперь также содержит код для пакетной обработки.

Herbie 09.08.2024 16:53

Другие вопросы по теме