Re-loading segmentation from mask

Describe Your Question

I perform segmentation using brush and save the segmentation mask in database. When I reload Xray, I want to reapply the segmentation. I add it to segmentation state but it does not render on screen even after after re-rendering the viewport.

What steps can we follow to reproduce the bug?

  1. I get segmentation mask, so I re-create a labelmap image for it like this
const labelmapImageId = `labelmap:${sourceImageId}:${Date.now()}`;
                const pixelData = new Uint8Array(metadata.pixelData);
                const hasNonZeroPixels = pixelData.some((pixel) => pixel !== 0);
                Logger.debug("Pixel data stats:", {
                  hasNonZeroPixels,
                  pixelDataLength: pixelData.length,
                  dimensions: metadata.dimensions,
                });

                if (hasNonZeroPixels) {
                  imageLoader.registerImageLoader("labelmap", (imageId) => {
                    const imageLoadObject = {
                      promise: undefined,
                      cancelFn: undefined,
                      decacheData: undefined,
                    };
                    const image = {
                      imageId: labelmapImageId,
                      minPixelValue: 0,
                      maxPixelValue: 1,
                      slope: 1.0,
                      intercept: 0,
                      windowCenter: 0.5,
                      windowWidth: 1,
                      getPixelData: () => pixelData,
                      rows: metadata.dimensions.height,
                      columns: metadata.dimensions.width,
                      height: metadata.dimensions.height,
                      width: metadata.dimensions.width,
                      color: false,
                      columnPixelSpacing: sourceImage.columnPixelSpacing || 1,
                      rowPixelSpacing: sourceImage.rowPixelSpacing || 1,
                      sizeInBytes: pixelData.length,
                    };
                    imageLoadObject.promise = Promise.resolve(image);
                    return imageLoadObject;
                  });
                  const labelmapImageNow =
                    await imageLoader.loadAndCacheImage(labelmapImageId);
await segmentation.addSegmentations([
                    {
                      segmentationId,
                      representation: {
                        type: csToolsEnums.SegmentationRepresentations.Labelmap,
                        data: {
                          imageIds: [labelmapImageId],
                          referencedImageIds: [sourceImageId],
                        },
                      },
                    },
                  ]);

                  // Add the segmentation representation to the viewport
                  await segmentation.addSegmentationRepresentations(
                    viewportId,
                    [
                      {
                        segmentationId,
                        type: csToolsEnums.SegmentationRepresentations.Labelmap,
                      },
                    ],
                  );
const viewport = renderingEngineRef.current.getViewport(viewportId);
          await viewport.render();

If I look at segmentation state, it is intact. If I look at labelmap image, it is also loaded and cached and has non zero pixels. Still I don’t see segmentation mask on my screen.

I would highly appreciate any support on how to debug this further.

@alireza @erikziegler

Is this cornerstone or OHIF? call a segmentation data modified event