cornerstone3D icon indicating copy to clipboard operation
cornerstone3D copied to clipboard

Segmentation tool doesn't show segments has Labelmap index over 255

Open mrsaleh opened this issue 1 month ago • 2 comments

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

mrsaleh avatar May 17 '24 13:05 mrsaleh