--AMI JS-- Создание сегментации LUT
У меня есть вопрос, касающийся использования LUT сегментации в AMI JS (не XTK, но тега ami js пока нет!). В частности, я хочу загрузить слой сегментации / labelmap и отобразить его правильными цветами, по одному для каждой метки.
Мой слой карты меток состоит из N целочисленных меток, которые определяют различные структуры (например, от 0 до 14000), которые также являются значениями вокселей карты меток. Каждый из ярлыков имеет свой связанный цвет (их генерирует Freesurfer и его можно увидеть по адресу: https://surfer.nmr.mgh.harvard.edu/fswiki/FsTutorial/AnatomicalROI/FreeSurferColorLUT).
То, что я хотел бы, это LUT, который для каждого отдельного ярлыка окрашивает его соответствующим цветом. У меня были проблемы с поиском правильного способа сделать это, и я до сих пор не добился успеха. То, что я сделал, это собрал все цвета и сохранил их в массив (цвета, нормализованные между 0 и 1, и первый компонент - это позиция внутри текстуры от 0 до 1, с шагом 1/ всего меток, что приводит к действительно маленький шаг, так как есть 1200 этикеток!). Из того, что я видел тогда, класс HelpersLUT берет все цвета и отображает их дискретно в текстуру, но цвета кажутся испорченными, и я не могу, кажется, получить также прозрачность...
Я также видел, что StackModels также имеет некоторые функции, такие как prepareSegmentation() и тому подобное, но не знает, как указать LUT, и не может заставить его работать (это не используется в примере).
Каков наилучший способ создания дискретной LUT с различным цветом для каждой целочисленной метки, а значение 0 будет прозрачным, а другие метки непрозрачными?
Процедура, используемая для генерации LUT: сначала я читаю JSON с информацией о Freesurfer и сохраняю ее в переменную, первый компонент каждого - это индекс метки от 0 до 1, а остальные - связанный цвет на метке также между 0 и 1. Я также создал LUT непрозрачности.
let customLUT = {
"fsLUT": [],
"default": [[0, 0, 0, 0], [0.25, 0.3, 0.4, 0.5], [0.5, 0.2, 0.5, 0.4],
[0.75, 0.1, 0.2, 0.3], [1, 0.5, 0.5, 0.8]],
"fsLUT0": [[0, 0], [0.01, 1], [0.6, 1], [1, 1]]
};
$.getJSON("https://cdn.rawgit.com/YorkeUtopy/ami-viewerData/e773d737/FreesurferInfo.json", function (data) {
FsInfo = data;
FsInfo.forEach(function (value, i) {
customLUT.fsLUT.push([i / FsInfo.length, (value.color[0] / 255), (value.color[1] / 255.000), (value.color[2] / 255.000)]);
});
});
Затем я создаю LUT помощников с определенным LUT0 и LUT с цветами и применяю его к текстуре. Все остальное просто как пример labelmap, создающего смесь слоев и т. Д.
lutLayerLblmap = new HelpersLut(
"my-lut-canvases-l1",
"default",
"linear", [[0, 0, 0, 0], [1, 1, 1, 1]],
customLUT.fsLUT0,
false
);
lutLayerLblmap.luts = customLUT;
lutLayerLblmap.lut = "fsLUT";
refObj.uniformsLayerLblmap.uLut.value = 1;
refObj.uniformsLayerLblmap.uTextureLUT.value = lutLayerLblmap.texture;
При этом появляются некоторые цвета, но они не являются правильными, и непрозрачность нарушена (я знаю, что LUT0 не является правильным и что это не дискретно!). Однако, когда я делаю helpers LUT дискретным и помещаю LUT0, например, [0,0],[1,1], цвета перепутаны, и непрозрачность не применяется правильно... возможно, дело в том, что значения вокселей не находятся между 0 и 1, но имеют такие значения, как 1100,1200...? или что я не правильно генерирую LUT (размер шага слишком мал?).... Вот несколько примеров LUT.
[0]: 0,0,0,0
[1]:0.0008319467554076539,0.27450980392156865,0.5098039215686274,0.7058823529411765
[2]:0.0016638935108153079,0.9607843137254902,0.9607843137254902,0.9607843137254902
[3]:0.0024958402662229617,0.803921568627451,0.24313725490196078,0.3058823529411765
[last -2]:0.997504159733777,0.08235294117647059,0.7058823529411765,0.7058823529411765
[last-1]:0.9983361064891847,0.8745098039215686,0.8627450980392157,0.23529411764705882
[last]:0.9991680532445923,0.8666666666666667,0.23529411764705882,0.23529411764705882
это пример данных, которые я использую:
1 ответ
Вы, кажется, делаете все хорошо.
Это ограничение тока на стороне AMI. В настоящее время он поддерживает только 256 цветов и, кроме того, требует нормализации значений.
В AMI нам нужно поддерживать новый тип LUT (сегментация LUT кажется хорошим именем).
Живая скрипка на основе вашего подхода.
const fsLUT = [];
fetch("https://cdn.rawgit.com/YorkeUtopy/ami-viewerData/e773d737/FreesurferInfo.json")
.then(response => response.json())
.then(jsonLUT => {
jsonLUT.forEach(function (value, i) {
fsLUT.push([
i / json.length,
(value.color[0] / 255),
(value.color[1] / 255.000),
(value.color[2] / 255.000)]);
});
return fsLUT;
})