javascript - --AMI JS-- Creating segmentation LUT -
i have question regarding use of segmentation luts in ami js (not xtk there no ami js tag yet!). particularly want load segmentation / labelmap layer , display right colors, 1 each label.
my labelmap layer consists of n integer labels define different structures (e.g 0 14000), voxel values of labelmap. each 1 of labels has different color associated (they generated freesurfer , can seen on: https://surfer.nmr.mgh.harvard.edu/fswiki/fstutorial/anatomicalroi/freesurfercolorlut ).
what lut that, each different label, paints correspondant color. have had trouble finding right way , have not had success far. have done colors , store them array (colors normalized between 0 , 1 , first component being position inside texture 0 1, step of 1/total labels, results in small step there 1200 labels!). i've seen then, helperslut class takes colors , maps them discretely texture, colors appear messed , can't seem opacities right either...
i have seen stackmodels have functionalities such preparesegmentation() , such not know how specify lut in there , cannot work either (it not used on example).
which best way create discrete lut different color each integer label , 0 value being transparent , other labels opaque?
the procedure used generate luts is: first read json information of freesurfer , store variable, first component of each 1 index of label between 0 , 1, , other ones associated color label between 0 , 1 well. have generated lut of opacities.
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)]); }); });
then create helpers lut lut0 defined , lut colors , apply texture. everythink else labelmap example createing layer mix, etc...
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;
with colors appear there not correct , opacities messed (i know lut0 not correct , not discrete!). however, when make helperslut discrete , put lut0 [0,0],[1,1], colors messed , opacities not apply correctly... maybe voxel values not between 0 , 1 have values such 1100,1200... ? or not correctly generating luts (step size small?).... here examples of 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
this sample data use:
you seem making fine.
it current limitation in ami side. supports 256 colors , on top of that, requires values normalized.
in ami, need support new type of lut (segmentation lut seems name).
live fiddle based on approach.
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([ / json.length, (value.color[0] / 255), (value.color[1] / 255.000), (value.color[2] / 255.000)]); }); return fslut; })
Comments
Post a Comment