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 year ago • 2 comments
trafficstars

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

I found the source of the issue limited to 255 colors I wanted to make a pull request , but there's a comment above of the line , that try justify this limitation

// Note: MAX_NUMBER_COLORS = 256 is needed because the current method to generate
// the default color table uses RGB.

Though I don't know how these two relates.

mrsaleh avatar May 17 '24 18:05 mrsaleh

There is no support for more than 255 segments right now

sedghi avatar May 21 '24 20:05 sedghi