cornerstone3D
cornerstone3D copied to clipboard
Segmentation tool doesn't show segments has Labelmap index over 255
Describe the Bug
I've loaded a label map volume, everything works OK , the only issue I have is that segments with indices over 255 doesn't show up. I have no error , when I change the visibility of these indices over 255, it works. but the viewport doesn't render them. I can't see them. here's my code to load label map volume , and add segmentation:
`public async LoadLabelMap(volumeId:string,niftiURL:string,segmentationId: string,labelmaps :LabelMap[]){ this.labelMaps = labelmaps;
const colorHexToRGBA = (hex)=>{
var rgb = parseInt(hex, 16);
var r = (rgb >> 16) & 0xFF;
var g = (rgb >> 8) & 0xFF;
var b = rgb & 0xFF;
return [b,g,r,255]
}
const config = segmentation.config.getGlobalConfig();
console.log(config);
config.renderInactiveSegmentations = false
config.representations.LABELMAP.renderOutline = false
config.representations.LABELMAP.outlineWidthInactive = 0
config.representations.LABELMAP.renderFillInactive = false;
config.representations.LABELMAP.renderFill = true;
config.representations.LABELMAP.fillAlpha = 1.0;
segmentation.config.setGlobalConfig(config)
const labelmapVolumeId = 'nifti:' + niftiURL;
await volumeLoader.createAndCacheVolume(labelmapVolumeId)
const destVolume = await volumeLoader.createAndCacheDerivedSegmentationVolume(volumeId,{
volumeId: segmentationId
});
const sourceVolume = cache.getVolume(labelmapVolumeId);
const { dimensions } = sourceVolume;
const sourceData = sourceVolume.getScalarData();
const destData = destVolume.getScalarData()
console.log(dimensions)
const keySet = new Set<number>();
let voxelIndex = 0;
for (let z = 0; z < dimensions[2]; z++) {
for (let y = 0; y < dimensions[1]; y++) {
for (let x = 0; x < dimensions[0]; x++) {
const data = sourceData[voxelIndex];
destData[voxelIndex] = sourceData[voxelIndex]
voxelIndex++;
keySet.add(data);
}
}
}
console.log(keySet)
destVolume.modified();
segmentation.addSegmentations([
{
segmentationId,
representation: {
// The type of segmentation
type: csToolsEnums.SegmentationRepresentations.Labelmap,
// The actual segmentation data, in the case of labelmap this is a
// reference to the source volume of the segmentation.
data: {
volumeId: segmentationId,
},
},
},
]);
const maxLabel = Math.max(...labelmaps.map(l=>l.num));
const colorLUT = Array<Types.Color>();
console.log(maxLabel)
for(let i=0;i<=maxLabel;i++){
colorLUT.push([0,0,0,0] as Types.Color)
}
labelmaps.forEach(label=>{
colorLUT[label.num] = colorHexToRGBA(label.color) as Types.Color;
})
segmentation.config.color.addColorLUT(colorLUT, 0)
const segmentationRepUUIDs = await segmentation.addSegmentationRepresentations(ToolsGroupId, [
{
segmentationId: segmentationId,
type: csToolsEnums.SegmentationRepresentations.Labelmap,
options: {
colorLUTOrIndex: 0,
}
}
])
this.segmentationRepUUID = segmentationRepUUIDs[0]
}`
Steps to Reproduce
Just load a label map that have data over 255.
The current behavior
It shows the segments with index lower than 255
The expected behavior
Show all the segments
OS
Windows 10
Node version
20
Browser
Firefox 125.0.3