--AMI JS--创建分段LUT

时间:2017-08-18 09:08:06

标签: javascript colormap xtk

我有一个关于在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

这是我使用的样本数据:

T1 Volume + Labelmap + Freesurfer JSON

1 个答案:

答案 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;
 })

http://jsfiddle.net/agoyre4e/20/