@cornerstonejs/tools 0.34.1 → 0.35.0
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.
- package/dist/cjs/tools/segmentation/BrushTool.d.ts +3 -2
- package/dist/cjs/tools/segmentation/BrushTool.js +1 -1
- package/dist/cjs/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/cjs/tools/segmentation/PaintFillTool.d.ts +3 -2
- package/dist/cjs/tools/segmentation/PaintFillTool.js +1 -1
- package/dist/cjs/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +6 -2
- package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.js +9 -13
- package/dist/cjs/utilities/segmentation/rectangleROIThresholdVolumeByRange.js.map +1 -1
- package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.d.ts +9 -5
- package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js +96 -8
- package/dist/cjs/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
- package/dist/esm/tools/segmentation/BrushTool.d.ts +3 -2
- package/dist/esm/tools/segmentation/BrushTool.js +3 -2
- package/dist/esm/tools/segmentation/BrushTool.js.map +1 -1
- package/dist/esm/tools/segmentation/PaintFillTool.d.ts +3 -2
- package/dist/esm/tools/segmentation/PaintFillTool.js +3 -2
- package/dist/esm/tools/segmentation/PaintFillTool.js.map +1 -1
- package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.d.ts +6 -2
- package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.js +9 -13
- package/dist/esm/utilities/segmentation/rectangleROIThresholdVolumeByRange.js.map +1 -1
- package/dist/esm/utilities/segmentation/thresholdVolumeByRange.d.ts +9 -5
- package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js +93 -8
- package/dist/esm/utilities/segmentation/thresholdVolumeByRange.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Types } from '@cornerstonejs/core';
|
|
2
2
|
import { BoundsIJK } from '../../types';
|
|
3
3
|
export declare type ThresholdRangeOptions = {
|
|
4
|
-
upper: number;
|
|
5
|
-
lower: number;
|
|
6
|
-
boundsIJK: BoundsIJK;
|
|
7
4
|
overwrite: boolean;
|
|
5
|
+
boundsIJK: BoundsIJK;
|
|
6
|
+
overlapType?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare type ThresholdInformation = {
|
|
9
|
+
volume: Types.IImageVolume;
|
|
10
|
+
lower: number;
|
|
11
|
+
upper: number;
|
|
8
12
|
};
|
|
9
|
-
declare function thresholdVolumeByRange(segmentationVolume: Types.IImageVolume,
|
|
13
|
+
declare function thresholdVolumeByRange(segmentationVolume: Types.IImageVolume, thresholdVolumeInformation: ThresholdInformation[], options: ThresholdRangeOptions): Types.IImageVolume;
|
|
10
14
|
export default thresholdVolumeByRange;
|
|
@@ -1,22 +1,107 @@
|
|
|
1
|
+
import { utilities as csUtils } from '@cornerstonejs/core';
|
|
1
2
|
import { pointInShapeCallback } from '../../utilities';
|
|
2
3
|
import { triggerSegmentationDataModified } from '../../stateManagement/segmentation/triggerSegmentationEvents';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import getBoundingBoxAroundShape from '../boundingBox/getBoundingBoxAroundShape';
|
|
5
|
+
const equalsCheck = (a, b) => {
|
|
6
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
7
|
+
};
|
|
8
|
+
function thresholdVolumeByRange(segmentationVolume, thresholdVolumeInformation, options) {
|
|
9
|
+
const { scalarData, spacing: segmentationSpacing, imageData: segmentationImageData, } = segmentationVolume;
|
|
10
|
+
const { overwrite, boundsIJK } = options;
|
|
11
|
+
const overlapType = options?.overlapType || 0;
|
|
8
12
|
if (overwrite) {
|
|
9
13
|
for (let i = 0; i < scalarData.length; i++) {
|
|
10
14
|
scalarData[i] = 0;
|
|
11
15
|
}
|
|
12
16
|
}
|
|
13
|
-
const
|
|
17
|
+
const volumeInfoList = [];
|
|
18
|
+
let baseVolumeIdx = 0;
|
|
19
|
+
for (let i = 0; i < thresholdVolumeInformation.length; i++) {
|
|
20
|
+
const { imageData, spacing, dimensions } = thresholdVolumeInformation[i].volume;
|
|
21
|
+
const volumeSize = thresholdVolumeInformation[i].volume.scalarData.length;
|
|
22
|
+
if (volumeSize === scalarData.length &&
|
|
23
|
+
equalsCheck(spacing, segmentationSpacing)) {
|
|
24
|
+
baseVolumeIdx = i;
|
|
25
|
+
}
|
|
26
|
+
const referenceValues = imageData.getPointData().getScalars().getData();
|
|
27
|
+
const lower = thresholdVolumeInformation[i].lower;
|
|
28
|
+
const upper = thresholdVolumeInformation[i].upper;
|
|
29
|
+
volumeInfoList.push({
|
|
30
|
+
imageData,
|
|
31
|
+
referenceValues,
|
|
32
|
+
lower,
|
|
33
|
+
upper,
|
|
34
|
+
spacing,
|
|
35
|
+
dimensions,
|
|
36
|
+
volumeSize,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
let overlaps, total, range;
|
|
40
|
+
const testOverlapRange = (volumeInfo, voxelSpacing, voxelCenter) => {
|
|
41
|
+
const callbackOverlap = ({ value }) => {
|
|
42
|
+
total = total + 1;
|
|
43
|
+
if (value >= range.lower && value <= range.upper) {
|
|
44
|
+
overlaps = overlaps + 1;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const { imageData, dimensions, lower, upper } = volumeInfo;
|
|
48
|
+
const overlapBounds = getVoxelOverlap(imageData, dimensions, voxelSpacing, voxelCenter);
|
|
49
|
+
total = 0;
|
|
50
|
+
overlaps = 0;
|
|
51
|
+
range = { lower, upper };
|
|
52
|
+
let overlapTest = false;
|
|
53
|
+
pointInShapeCallback(imageData, () => true, callbackOverlap, overlapBounds);
|
|
54
|
+
if (overlapType === 0) {
|
|
55
|
+
overlapTest = overlaps > 0;
|
|
56
|
+
}
|
|
57
|
+
else if (overlapType == 1) {
|
|
58
|
+
overlapTest = overlaps === total;
|
|
59
|
+
}
|
|
60
|
+
return overlapTest;
|
|
61
|
+
};
|
|
62
|
+
const testRange = (volumeInfo, pointIJK) => {
|
|
63
|
+
const { imageData, referenceValues, lower, upper } = volumeInfo;
|
|
14
64
|
const offset = imageData.computeOffsetIndex(pointIJK);
|
|
15
65
|
const value = referenceValues[offset];
|
|
16
66
|
if (value <= lower || value >= upper) {
|
|
17
|
-
return;
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const getVoxelOverlap = (imageData, dimensions, voxelSpacing, voxelCenter) => {
|
|
74
|
+
const voxelCornersWorld = [];
|
|
75
|
+
for (let i = 0; i < 2; i++) {
|
|
76
|
+
for (let j = 0; j < 2; j++) {
|
|
77
|
+
for (let k = 0; k < 2; k++) {
|
|
78
|
+
const point = voxelCenter;
|
|
79
|
+
point[0] = point[0] + ((i * 2 - 1) * voxelSpacing[0]) / 2;
|
|
80
|
+
point[1] = point[1] + ((j * 2 - 1) * voxelSpacing[1]) / 2;
|
|
81
|
+
point[2] = point[2] + ((k * 2 - 1) * voxelSpacing[2]) / 2;
|
|
82
|
+
voxelCornersWorld.push(point);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const voxelCornersIJK = voxelCornersWorld.map((world) => csUtils.transformWorldToIndex(imageData, world));
|
|
87
|
+
const overlapBounds = getBoundingBoxAroundShape(voxelCornersIJK, dimensions);
|
|
88
|
+
return overlapBounds;
|
|
89
|
+
};
|
|
90
|
+
const callback = ({ index, pointIJK, pointLPS }) => {
|
|
91
|
+
let insert = volumeInfoList.length > 0;
|
|
92
|
+
for (let i = 0; i < volumeInfoList.length; i++) {
|
|
93
|
+
if (volumeInfoList[i].volumeSize === scalarData.length) {
|
|
94
|
+
insert = testRange(volumeInfoList[i], pointIJK);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
insert = testOverlapRange(volumeInfoList[i], volumeInfoList[baseVolumeIdx].spacing, pointLPS);
|
|
98
|
+
}
|
|
99
|
+
if (!insert) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
18
102
|
}
|
|
19
|
-
|
|
103
|
+
if (insert)
|
|
104
|
+
scalarData[index] = 1;
|
|
20
105
|
};
|
|
21
106
|
pointInShapeCallback(segmentationImageData, () => true, callback, boundsIJK);
|
|
22
107
|
triggerSegmentationDataModified(segmentationVolume.volumeId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thresholdVolumeByRange.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/thresholdVolumeByRange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"thresholdVolumeByRange.js","sourceRoot":"","sources":["../../../../src/utilities/segmentation/thresholdVolumeByRange.ts"],"names":[],"mappings":"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"}
|