Вопрос

Я просматриваю набор наборов данных изображений в ImageJ (стек изображений .tif, около 130 кадров), и у меня есть проблема с набором данных. Это серия изображений микроскопа, каждый кадр является плоскостью примерно на 3-4 микрометрах над/ниже предыдущего. Когда я углубляюсь в набор данных, рассеяние света создает более яркий фон, поэтому основными характеристиками образца являются тусклые.

Тем не менее, яркости и контрастная функция ImageJ использует гистограмму, которая представляет собой весь Стоп изображений. Когда я нажимаю «Авто» и «сбросить» на изображении глубоко в стеке, результирующий контраст идеален: все функции очень хорошо освещаются. Однако, в начале стека, большинство функций стали насыщенными.

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

Это было полезно?

Решение

Хороший способ начать написать такой сценарий - использовать макроэлектрический регистр ImageJ - вы можете начать с этого с Plugins > Macros > Record .... Анкет Для этого примера я предполагаю, что вы переключили Record: Опционное поле для JavaScript, но если вы больше знакомы с макро -языком ImageJ или писательными плагинами в Java, один из других может быть лучшим выбором. Если вы откроете изображение и используете Image > Stacks > Set Slice ... и выберите (скажем) Slice 20, вы должны увидеть:

imp.setSlice(20);

... появляются в рекордере. Теперь, если вы бежите Image > Adjust > Brightness/Contrast... и выберите Auto, вы должны увидеть в рекордере, что это эквивалент бега Enhance Contrast Сохранение 0,35% насыщенных пикселей. Проблема с этим, как вы отмечали, заключается в том, что это регулирует минимальные и максимальные значения для всего стека, а не только для этого. Тем не менее, вы можете бежать Enhance Contrast с разными параметрами при запуске Process > Enhance Contrast. Анкет Раздел об этом опции на ImageJ Документация WIKI Объясняет, что если вы хотите изменить значения пикселей, а не устанавливать минимальный и максимум для стека, вам необходимо выбрать опцию «нормализовать». Если я решите сделать это вместо этого, Macro Recorder записывает:

imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");

... и вы должны увидеть, что только срез 20 был изменен. Затем вы можете обернуть это в петлю, которая запускает одинаковое улучшение на каждом кусочке:

var imp = IJ.getImage();
var n = imp.getStackSize();

for( var i = 0; i < n; ++i) {
    imp.setSlice(i+1);
    IJ.run(imp, "Enhance Contrast", "saturated=4 normalize");
}

(Если вы используете Fiji, то редактор скрипта (например, через File > New > Script) это простой способ экспериментировать с такими сценариями.)

Конечно, использование опции Normalize приводит к изменению значений пикселей, что означает, что в этом случае вы теряете информацию, поэтому я не буду использовать полученный стек для количественных результатов.

Я надеюсь, что это будет использовать.

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

Вы также можете рассмотреть возможность использования CellProfiler обрабатывать изображения. Даже если CP не может сделать именно то, что вы пытаетесь сделать напрямую, вы можете запустить команды ImageJ, плагины и макросы от CP.

В самый простой, вы можете создать трубопровод CP, который просто имеет загрузки и Runimagej.

Принятый ответ является лучшим для вопроса ОП, но небольшой вариант - если вы хотите изменить яркость/контрастность в зависимости от срезах ваших конкретных данных.

В моем случае я хотел иметь пороговый эффект, но пороговое значение изменялось в каждом срезе стека. Я пошел на несколько разных ломтиков и вручную нашел пороговое значение. Затем я нашел приблизительную функцию для порогового значения (телевидение) в зависимости от среза (-ов) следующим образом:

Tv=4000/s-17

Следовательно, тогда мой сценарий становится:

importClass(Packages.ij.IJ);

var imp = IJ.getImage();
var n = imp.getStackSize();
var miny,maxy;

for( var i = 1; i < n+1; ++i) {
    imp.setSlice(i);
    miny=parseInt(4000/i-17);
    maxy=miny+5;
    IJ.setMinAndMax(imp, miny, maxy);
    IJ.run(imp, "Apply LUT", "slice");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top