From fa95bae6ef5e813dda4094e4ab64383f50c4e084 Mon Sep 17 00:00:00 2001 From: James Petts Date: Mon, 4 May 2020 15:43:09 +0100 Subject: [PATCH] Support initialization of segment color from RecommendedDisplayCIELabValue (#1709) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 🐛 Proper error handling for derived display sets * Revert idc.js change * Load correct Segment colors. --- .../src/loadSegmentation.js | 67 ++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/extensions/dicom-segmentation/src/loadSegmentation.js b/extensions/dicom-segmentation/src/loadSegmentation.js index b0f9dde9b..63cbef08e 100644 --- a/extensions/dicom-segmentation/src/loadSegmentation.js +++ b/extensions/dicom-segmentation/src/loadSegmentation.js @@ -49,6 +49,7 @@ export default async function loadSegmentation( // TODO: Could define a color LUT based on colors in the SEG. const labelmapIndex = _getNextLabelmapIndex(imageIds[0]); + const colorLUTIndex = _makeColorLUTAndGetIndex(segMetadata); setters.labelmap3DByFirstImageId( imageIds[0], @@ -56,7 +57,8 @@ export default async function loadSegmentation( labelmapIndex, segMetadata, imageIds.length, - segmentsOnFrame + segmentsOnFrame, + colorLUTIndex ); segDisplaySet.labelmapIndex = labelmapIndex; @@ -86,6 +88,69 @@ function _getNextLabelmapIndex(firstImageId) { return labelmapIndex; } +function _makeColorLUTAndGetIndex(segMetadata) { + const { setters, state } = cornerstoneTools.getModule('segmentation'); + const { colorLutTables } = state; + const colorLUTIndex = _getNextColorLUTIndex(); + + const { data } = segMetadata; + + if ( + !data.some( + segment => + segment && + (segment.ROIDisplayColor || segment.RecommendedDisplayCIELabValue) + ) + ) { + // Use default cornerstoneTools colorLUT. + return 0; + } + + const colorLUT = []; + + for (let i = 0; i < data.length; i++) { + const segment = data[i]; + if (!segment) { + continue; + } + + const { ROIDisplayColor, RecommendedDisplayCIELabValue } = segment; + + if (RecommendedDisplayCIELabValue) { + const rgb = dcmjs.data.Colors.dicomlab2RGB( + RecommendedDisplayCIELabValue + ).map(x => Math.round(x * 255)); + + colorLUT[i] = [...rgb, 255]; + } else if (ROIDisplayColor) { + colorLUT[i] = [...ROIDisplayColor, 255]; + } else { + colorLUT[i] = [...colorLutTables[0][i]]; + } + } + + colorLUT.shift(); + setters.colorLUT(colorLUTIndex, colorLUT); + + return colorLUTIndex; +} + +function _getNextColorLUTIndex() { + const { state } = cornerstoneTools.getModule('segmentation'); + const { colorLutTables } = state; + + let colorLUTIndex = colorLutTables.length; + + for (let i = 0; i < colorLutTables.length; i++) { + if (!colorLutTables[i]) { + colorLUTIndex = i; + break; + } + } + + return colorLUTIndex; +} + function _parseSeg(arrayBuffer, imageIds) { return dcmjs.adapters.Cornerstone.Segmentation.generateToolState( imageIds,