@cornerstonejs/adapters 3.7.14 → 3.7.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -51,7 +51,7 @@ const generateSegmentationDefaultOptions = {
|
|
|
51
51
|
*/
|
|
52
52
|
function generateSegmentation(images, inputLabelmaps3D) {
|
|
53
53
|
let userOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
54
|
-
const isMultiframe = images[0]
|
|
54
|
+
const isMultiframe = isMultiframeImage(images[0]);
|
|
55
55
|
const segmentation = _createSegFromImages(images, isMultiframe, userOptions);
|
|
56
56
|
return fillSegmentation(segmentation, inputLabelmaps3D, userOptions);
|
|
57
57
|
}
|
|
@@ -893,14 +893,36 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
|
|
|
893
893
|
ReferencedSOPInstanceUID,
|
|
894
894
|
ReferencedFrameNumber
|
|
895
895
|
} = SourceImageSequence;
|
|
896
|
-
const
|
|
897
|
-
if (
|
|
898
|
-
|
|
896
|
+
const baseImageId = sopUIDImageIdIndexMap[ReferencedSOPInstanceUID];
|
|
897
|
+
if (!baseImageId) {
|
|
898
|
+
console.warn(`No imageId found for SOPInstanceUID: ${ReferencedSOPInstanceUID}`);
|
|
899
|
+
return undefined;
|
|
899
900
|
}
|
|
900
|
-
if (ReferencedFrameNumber) {
|
|
901
|
-
|
|
901
|
+
if (ReferencedFrameNumber !== undefined) {
|
|
902
|
+
if (baseImageId.includes("frames/")) {
|
|
903
|
+
return baseImageId.replace(/frames\/\d+/, `frames/${ReferencedFrameNumber}`);
|
|
904
|
+
} else if (baseImageId.includes("frame=")) {
|
|
905
|
+
return baseImageId.replace(/frame=\d+/, `frame=${ReferencedFrameNumber - 1}`);
|
|
906
|
+
} else {
|
|
907
|
+
if (baseImageId.includes("wadors:")) {
|
|
908
|
+
return `${baseImageId}/frames/${ReferencedFrameNumber}`;
|
|
909
|
+
} else {
|
|
910
|
+
return `${baseImageId}?frame=${ReferencedFrameNumber - 1}`;
|
|
911
|
+
}
|
|
912
|
+
}
|
|
902
913
|
}
|
|
903
|
-
return
|
|
914
|
+
return baseImageId;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* Determines if an image is a multiframe image based on its metadata.
|
|
919
|
+
*
|
|
920
|
+
* @param {Object} imageMetadata - The metadata object for the image
|
|
921
|
+
* @param {number} [imageMetadata.NumberOfFrames] - The number of frames in the image
|
|
922
|
+
* @returns {boolean} True if the image is a multiframe image (NumberOfFrames > 1)
|
|
923
|
+
*/
|
|
924
|
+
function isMultiframeImage(imageMetadata) {
|
|
925
|
+
return imageMetadata && imageMetadata.NumberOfFrames > 1;
|
|
904
926
|
}
|
|
905
927
|
|
|
906
928
|
/**
|
|
@@ -916,37 +938,31 @@ function getImageIdOfSourceImageBySourceImageSequence(SourceImageSequence, sopUI
|
|
|
916
938
|
* @return {String} The corresponding imageId.
|
|
917
939
|
*/
|
|
918
940
|
function getImageIdOfSourceImagebyGeometry(ReferencedSeriesInstanceUID, FrameOfReferenceUID, PerFrameFunctionalGroup, imageIds, metadataProvider, tolerance) {
|
|
919
|
-
if (ReferencedSeriesInstanceUID
|
|
941
|
+
if (!ReferencedSeriesInstanceUID || !PerFrameFunctionalGroup.PlanePositionSequence?.[0]?.ImagePositionPatient) {
|
|
920
942
|
return undefined;
|
|
921
943
|
}
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
944
|
+
const segFramePosition = PerFrameFunctionalGroup.PlanePositionSequence[0].ImagePositionPatient;
|
|
945
|
+
for (let imageId of imageIds) {
|
|
946
|
+
const sourceImageMetadata = metadataProvider.get("instance", imageId);
|
|
947
|
+
if (!sourceImageMetadata) {
|
|
925
948
|
continue;
|
|
926
949
|
}
|
|
927
|
-
|
|
928
|
-
|
|
950
|
+
const isMultiframe = isMultiframeImage(sourceImageMetadata);
|
|
951
|
+
if (!sourceImageMetadata.ImagePositionPatient || sourceImageMetadata.FrameOfReferenceUID !== FrameOfReferenceUID || sourceImageMetadata.SeriesInstanceUID !== ReferencedSeriesInstanceUID) {
|
|
952
|
+
continue;
|
|
929
953
|
}
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
954
|
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
*/
|
|
943
|
-
function getImageIdOfReferencedFrame(sopInstanceUid, frameNumber, sopUIDImageIdIndexMap) {
|
|
944
|
-
const imageId = sopUIDImageIdIndexMap[sopInstanceUid];
|
|
945
|
-
if (!imageId) {
|
|
946
|
-
return;
|
|
955
|
+
// For multiframe images, check each frame's position
|
|
956
|
+
if (isMultiframe) {
|
|
957
|
+
const framePosition = metadataProvider.get("imagePlaneModule", imageId)?.imagePositionPatient;
|
|
958
|
+
if (framePosition && compareArrays(segFramePosition, framePosition, tolerance)) {
|
|
959
|
+
return imageId;
|
|
960
|
+
}
|
|
961
|
+
} else if (compareArrays(segFramePosition, sourceImageMetadata.ImagePositionPatient, tolerance)) {
|
|
962
|
+
return imageId;
|
|
963
|
+
}
|
|
947
964
|
}
|
|
948
|
-
|
|
949
|
-
return imageIdFrameNumber === frameNumber - 1 ? imageId : undefined;
|
|
965
|
+
return undefined;
|
|
950
966
|
}
|
|
951
967
|
|
|
952
968
|
/**
|
|
@@ -1161,4 +1177,4 @@ const Segmentation = {
|
|
|
1161
1177
|
fillSegmentation
|
|
1162
1178
|
};
|
|
1163
1179
|
|
|
1164
|
-
export { _createSegFromImages, _getLabelmapsFromReferencedFrameIndicies, alignPixelDataWithSourceData, calculateCentroid, checkSEGsOverlapping, Segmentation as default, fillSegmentation, findReferenceSourceImageId, generateSegmentation, generateToolState,
|
|
1180
|
+
export { _createSegFromImages, _getLabelmapsFromReferencedFrameIndicies, alignPixelDataWithSourceData, calculateCentroid, checkSEGsOverlapping, Segmentation as default, fillSegmentation, findReferenceSourceImageId, generateSegmentation, generateToolState, getImageIdOfSourceImageBySourceImageSequence, getImageIdOfSourceImagebyGeometry, getSegmentIndex, getSegmentMetadata, getUnpackedChunks, getUnpackedOffsetAndLength, getValidOrientations, insertOverlappingPixelDataPlanar, insertPixelDataPlanar, readFromUnpackedChunks, unpackPixelData };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/adapters",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.16",
|
|
4
4
|
"description": "Adapters for Cornerstone3D to/from formats including DICOM SR and others",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -84,8 +84,8 @@
|
|
|
84
84
|
"ndarray": "^1.0.19"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@cornerstonejs/core": "^3.7.
|
|
88
|
-
"@cornerstonejs/tools": "^3.7.
|
|
87
|
+
"@cornerstonejs/core": "^3.7.16",
|
|
88
|
+
"@cornerstonejs/tools": "^3.7.16"
|
|
89
89
|
},
|
|
90
|
-
"gitHead": "
|
|
90
|
+
"gitHead": "d1bf75eda8724e8213c0cf9f555b7d6a58504f29"
|
|
91
91
|
}
|