我有一个关于在AMI JS中使用分段LUT的问题(不是XTK,但还没有ami js标签!)。特别是我想要做的是加载分割/标签图层并用正确的颜色显示它,每个标签一个。
我的标签图层由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的过程是:首先,我使用Freesurfer的信息读取JSON并将其存储到变量中,每个的第一个组件是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)]);
});
});
然后我创建一个LUT0定义的辅助LUT和带有颜色的LUT并将其应用于纹理。 Everythink else就像创建图层组合的标签图示例一样......
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不正确并且它不是离散的!)。但是,当我使helpersLUT离散并放置像[0,0],[1,1]这样的LUT0时,颜色混乱并且不透明度不能正确应用...可能是体素值不在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
这是我使用的样本数据:
答案 0 :(得分:1)
你似乎把一切都搞好了。
这是AMI方面的当前限制。 它目前只支持256种颜色,最重要的是,它需要对值进行标准化。
在AMI中,我们需要支持一种新型的LUT(Segmentation 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;
})