Может ли кто-нибудь сказать мне, почему с помощью этого макроса я просто получаю на выходе для каждого канала каждого изображения файл .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, я начинаю с изображений .nd2, полученных на конфокальном микроскопе, у меня есть разные каналы, и для каждого из них я хочу сложить (метод проекции Макса) и настроить яркость/контраст, чтобы получить файл .png. Я запускаю конвейер как макрос при пакетной обработке Фиджи... есть ли у вас какие-либо предположения, что происходит не так?
Для каждого цветового канала вы хотите сделать максимальную z-проекцию? (Вы пишете: «Я хочу сложить [метод максимальной проекции], но максимальная проекция дает вам одно изображение, а не стопку. Пожалуйста, поймите, что нам нужно точное описание !) Конечно, у меня есть предложения, но я не буду беспокоиться о вашем коде, а напишу его самостоятельно. Не могли бы вы предоставить небольшой образец ваших данных .nd2, возможно, через службу, похожую на Dropbox?
Прежде чем мы начнем с кодирования, хотелось бы узнать, как импортировать файлы .nd2 в ImageJ? Я бы импортировал их с помощью импортера BioFormats с галочкой разделенных каналов, чтобы вы получали отдельные стеки для цветов. Это, конечно, можно сделать с помощью вызова макроса.
Синтаксис этой строки:
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-стек каждого канала, а не на сложенный проекция. Я тестировал разные попытки и сценарии, которые нашел в Интернете, но ни одна из них не сработала, есть идеи?
Не могли бы вы ответить на мой запрос выше? Если мы не знаем точно, какие изображения или стопки вы хотите обрабатывать, как и с каким именно результатом, мы не сможем помочь.
Я отредактировал свой ответ выше, чтобы объяснить, почему я думаю, что вы все еще не получаете желаемого результата. Вызовы run("Update");
также не нужны и вызывают ошибку при запуске кода. Если вы перейдете на предложенное мной изменение run("Z Project...", "projection=[Max Intensity]");
думаю, оно сработает.
@quantixed Я протестировал новый код, изменив его, как вы предложили, но, похоже, он все еще не работает... Я добавил пример изображений, которые я получаю с помощью конвейера, или выполняю ту же процедуру непосредственно на Фиджи для каждого изображения (см. изображения вопросов, которые я прикрепил, чтобы было более понятно)....
Я снова отредактировал свой ответ. На этот раз он показывает полную функцию. Я проверил, что он работает с 3-канальным z-стеком в формате nd2. Возможно, внесенные вами изменения не отражали то, что я предлагал.
Поэтому, если я скопирую и вставлю последнюю версию вашего кода @quantixed, моя проблема все равно останется, каким-то образом не работает сложение Z фокальных плоскостей, и я могу увидеть это, сохранив файл .tif, который показывается мне, когда я открываю его каждый раз. фокальная плоскость изображения для каждого канала в одном файле. Я не знаю, почему у тебя это работает, а у меня нет.
Ниже вы найдете демонстрационный макрос 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 индивидуально, как я могу настроить его в цикле для пакетная обработка всех файлов в папке? Заранее спасибо!
«проблемы с сохранением созданного файла .png»; Пожалуйста, скажите мне, что это значит. Мой макрос сохраняет PNG-файлы в тот же каталог, из которого взяты стопки. Для пакетной обработки вам необходимо вызвать основные части моего макроса из цикла. В опубликованном вами коде этот цикл не показан, поэтому я предположил, что вы знаете, как это сделать. Действительно сложно помочь, если вовремя не предоставить необходимую информацию.
Я имею в виду, что когда я запустил макрос, Фиджи показывает ошибку, из-за которой не удается сохранить файл .png, поскольку он не находит путь (хотя я указал его так же, как вы в своем макросе). Может быть, вы можете написать здесь точный код, который должен работать, если я скопирую и вставлю его в Фиджи -> процесс -> пакет -> макрос? возможно, так мне будет яснее, что именно мне следует ему сказать, чтобы все заработало. Заранее спасибо!
Извините, но мой опубликованный код работает, как описано, то есть правильно сохраняет PNG-файл. У меня нет опыта работы с «Фиджи -> процесс -> пакет -> макрос», потому что я всегда кодирую внешний пакетный цикл в соответствии с этим примером кода «Справка >> Примеры >> Макрос >> Папка процесса».
Дорогой @Herbie, спасибо! Теперь все работает правильно!!
Пожалуйста, проверьте мой предыдущий ответ, который теперь также содержит код для пакетной обработки.
Чтобы оказать существенную помощь, пожалуйста, подробно объясните, с чего вы начинаете и что хотите получить. Ваш приведенный выше код не поможет, если вы не предоставите точное описание того, какие изображения или стеки вы начинаете и что вы хотите сохранить в конце какого типа обработки.