Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp @ 1836:5a6adbc20ace
cleanup cmake
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Sat, 12 Jun 2021 13:43:42 +0200 |
parents | 0489fe25ce48 |
children | 2789b4b0e0a8 |
rev | line source |
---|---|
746 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
1739
9ac2a65d4172
upgrade to year 2021
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1679
diff
changeset
|
5 * Copyright (C) 2017-2021 Osimis S.A., Belgium |
746 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public License |
746 | 9 * as published by the Free Software Foundation, either version 3 of |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
16 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * <http://www.gnu.org/licenses/>. |
746 | 20 **/ |
21 | |
22 | |
23 #include "DicomInstanceParameters.h" | |
24 | |
25 #include "../Scene2D/ColorTextureSceneLayer.h" | |
26 #include "../Scene2D/FloatTextureSceneLayer.h" | |
1750 | 27 #include "GeometryToolbox.h" |
28 #include "ImageToolbox.h" | |
746 | 29 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
30 #include <Images/Image.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
31 #include <Images/ImageProcessing.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
32 #include <Logging.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
33 #include <OrthancException.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
34 #include <Toolbox.h> |
746 | 35 |
36 | |
37 namespace OrthancStone | |
38 { | |
1636 | 39 static void ExtractFrameOffsets(Vector& target, |
40 const Orthanc::DicomMap& dicom, | |
41 unsigned int numberOfFrames) | |
746 | 42 { |
43 // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html | |
44 | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
45 std::string increment; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
46 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
47 if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) |
746 | 48 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
49 Orthanc::Toolbox::ToUpperCase(increment); |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
50 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
51 // We only support volumes where the FrameIncrementPointer (0028,0009) (required) contains |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
52 // the "Grid Frame Offset Vector" tag (DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
53 if (increment != "3004,000C") |
746 | 54 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
55 LOG(WARNING) << "Bad value for the FrameIncrementPointer tags in a multiframe image"; |
1636 | 56 target.resize(0); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
57 return; |
746 | 58 } |
59 } | |
60 | |
1636 | 61 if (!LinearAlgebra::ParseVector(target, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || |
62 target.size() != numberOfFrames) | |
746 | 63 { |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
64 LOG(ERROR) << "The frame offset information (GridFrameOffsetVector (3004,000C)) is missing in a multiframe image"; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
65 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
66 // DO NOT use ".clear()" here, as the "Vector" class doesn't behave like std::vector! |
1636 | 67 target.resize(0); |
746 | 68 } |
69 } | |
70 | |
71 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
72 DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) |
746 | 73 { |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
74 if (!dicom.LookupStringValue(studyInstanceUid_, Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, false) || |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
75 !dicom.LookupStringValue(seriesInstanceUid_, Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, false) || |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
76 !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) |
746 | 77 { |
78 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
79 } | |
80 | |
81 std::string s; | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
82 if (dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) |
746 | 83 { |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
84 sopClassUid_ = StringToSopClassUid(s); |
746 | 85 } |
86 else | |
87 { | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
88 sopClassUid_ = SopClassUid_Other; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
89 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
90 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
91 uint32_t n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
92 if (dicom.ParseUnsignedInteger32(n, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
93 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
94 numberOfFrames_ = n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
95 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
96 else |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
97 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
98 numberOfFrames_ = 1; |
746 | 99 } |
100 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
101 if (!dicom.HasTag(Orthanc::DICOM_TAG_COLUMNS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
102 !dicom.GetValue(Orthanc::DICOM_TAG_COLUMNS).ParseFirstUnsignedInteger(width_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
103 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
104 width_ = 0; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
105 } |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
106 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
107 if (!dicom.HasTag(Orthanc::DICOM_TAG_ROWS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
108 !dicom.GetValue(Orthanc::DICOM_TAG_ROWS).ParseFirstUnsignedInteger(height_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
109 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
110 height_ = 0; |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
111 } |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
112 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
113 |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
114 bool sliceThicknessPresent = true; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
115 if (!dicom.ParseDouble(sliceThickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) |
746 | 116 { |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
117 if (numberOfFrames_ > 1) |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
118 { |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
119 LOG(INFO) << "The (non-madatory) slice thickness information is missing in a multiframe image"; |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
120 } |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
121 |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
122 sliceThickness_ = 100.0 * std::numeric_limits<double>::epsilon(); |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
123 sliceThicknessPresent = false; |
746 | 124 } |
125 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
126 hasPixelSpacing_ = GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); |
746 | 127 |
128 std::string position, orientation; | |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
129 if (dicom.LookupStringValue(position, Orthanc::DICOM_TAG_IMAGE_POSITION_PATIENT, false) && |
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
130 dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) |
746 | 131 { |
132 geometry_ = CoordinateSystem3D(position, orientation); | |
133 } | |
134 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
135 // Must be AFTER setting "numberOfFrames_" |
1639 | 136 if (numberOfFrames_ > 1) |
137 { | |
138 ExtractFrameOffsets(frameOffsets_, dicom, numberOfFrames_); | |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
139 |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
140 // if the slice thickness is unknown, we try to infer it from the sequence of grid frame offsets |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
141 // this only works if: |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
142 // - the first offset is 0.0 (case (a) of http://dicom.nema.org/medical/Dicom/2017c/output/chtml/part03/sect_C.8.8.3.2.html) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
143 // - the offsets are all equal, to some small tolerance |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
144 // - the offsets is positive (increasing throughout the frames) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
145 if (!sliceThicknessPresent) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
146 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
147 if (frameOffsets_.size() >= 2) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
148 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
149 double sliceThickness = frameOffsets_[1] - frameOffsets_[0]; |
1817 | 150 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
151 if (sliceThickness > 0) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
152 { |
1817 | 153 bool sameSized = true; |
154 | |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
155 for (size_t i = 2; i < frameOffsets_.size(); ++i) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
156 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
157 double currentThickness = frameOffsets_[i] - frameOffsets_[i-1]; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
158 if (!LinearAlgebra::IsNear(sliceThickness, currentThickness)) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
159 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
160 LOG(ERROR) << "Unable to extract slice thickness from GridFrameOffsetVector (3004,000C) (reason: varying spacing)"; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
161 sameSized = false; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
162 break; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
163 } |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
164 } |
1817 | 165 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
166 if (sameSized) |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
167 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
168 sliceThickness_ = sliceThickness; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
169 LOG(INFO) << "SliceThickness was not specified in the Dicom but was inferred from GridFrameOffsetVector (3004,000C)."; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
170 } |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
171 } |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
172 } |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
173 else |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
174 { |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
175 LOG(ERROR) << "Unable to extract slice thickness from GridFrameOffsetVector (3004,000C) (reason: GridFrameOffsetVector not present or too small)"; |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
176 } |
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
177 } |
1639 | 178 } |
179 else | |
180 { | |
181 frameOffsets_.resize(0); | |
182 } | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
183 |
746 | 184 if (sopClassUid_ == SopClassUid_RTDose) |
185 { | |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
186 static const Orthanc::DicomTag DICOM_TAG_DOSE_UNITS(0x3004, 0x0002); |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
187 |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
188 if (!dicom.LookupStringValue(doseUnits_, DICOM_TAG_DOSE_UNITS, false)) |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
189 { |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
190 LOG(ERROR) << "Tag DoseUnits (0x3004, 0x0002) is missing in " << sopInstanceUid_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
191 doseUnits_.clear(); |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
192 } |
746 | 193 } |
194 | |
195 if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && | |
196 dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) | |
197 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
198 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
199 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
200 LOG(INFO) << "DOSE HAS Rescale*: rescaleIntercept_ = " << rescaleIntercept_ << " rescaleSlope_ = " << rescaleSlope_; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
201 // WE SHOULD NOT TAKE THE RESCALE VALUE INTO ACCOUNT IN THE CASE OF DOSES |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
202 hasRescale_ = false; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
203 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
204 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
205 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
206 hasRescale_ = true; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
207 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
208 |
746 | 209 } |
210 else | |
211 { | |
212 hasRescale_ = false; | |
213 } | |
214 | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
215 if (dicom.ParseDouble(doseGridScaling_, Orthanc::DICOM_TAG_DOSE_GRID_SCALING)) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
216 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
217 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
218 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
219 LOG(INFO) << "DOSE HAS DoseGridScaling: doseGridScaling_ = " << doseGridScaling_; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
220 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
221 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
222 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
223 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
224 doseGridScaling_ = 1.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
225 if (sopClassUid_ == SopClassUid_RTDose) |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
226 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
227 LOG(ERROR) << "Tag DoseGridScaling (0x3004, 0x000e) is missing in " << sopInstanceUid_ << " doseGridScaling_ will be set to 1.0"; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
228 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
229 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
230 |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
231 bool ok = false; |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
232 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
233 if (LinearAlgebra::ParseVector(windowingPresetCenters_, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
234 LinearAlgebra::ParseVector(windowingPresetWidths_, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH)) |
746 | 235 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
236 if (windowingPresetCenters_.size() == windowingPresetWidths_.size()) |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
237 { |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
238 ok = true; |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
239 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
240 else |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
241 { |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
242 LOG(ERROR) << "Mismatch in the number of preset windowing widths/centers, ignoring this"; |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
243 ok = false; |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
244 } |
746 | 245 } |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
246 |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
247 if (!ok) |
746 | 248 { |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
249 // Don't use "Vector::clear()", as it has not the same meaning as "std::vector::clear()" |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
250 windowingPresetCenters_.resize(0); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
251 windowingPresetWidths_.resize(0); |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
252 } |
746 | 253 |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
254 // This computes the "IndexInSeries" metadata from Orthanc (check |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
255 // out "Orthanc::ServerIndex::Store()") |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
256 hasIndexInSeries_ = ( |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
257 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
258 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); |
1646
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
259 |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
260 if (!dicom.LookupStringValue( |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
261 frameOfReferenceUid_, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, false)) |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
262 { |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
263 frameOfReferenceUid_.clear(); |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
264 } |
746 | 265 } |
266 | |
267 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
268 const Orthanc::DicomImageInformation& DicomInstanceParameters::GetImageInformation() const |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
269 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
270 assert(tags_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
271 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
272 if (imageInformation_.get() == NULL) |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
273 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
274 const_cast<DicomInstanceParameters&>(*this).imageInformation_. |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
275 reset(new Orthanc::DicomImageInformation(GetTags())); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
276 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
277 assert(imageInformation_->GetWidth() == GetWidth()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
278 assert(imageInformation_->GetHeight() == GetHeight()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
279 assert(imageInformation_->GetNumberOfFrames() == GetNumberOfFrames()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
280 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
281 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
282 assert(imageInformation_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
283 return *imageInformation_; |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
284 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
285 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
286 |
1636 | 287 CoordinateSystem3D DicomInstanceParameters::GetFrameGeometry(unsigned int frame) const |
746 | 288 { |
1636 | 289 if (frame >= data_.numberOfFrames_) |
746 | 290 { |
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
292 } | |
1636 | 293 else if (data_.frameOffsets_.empty()) |
746 | 294 { |
1636 | 295 return data_.geometry_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
296 } |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
297 else |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
298 { |
1636 | 299 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
746 | 300 |
301 return CoordinateSystem3D( | |
1636 | 302 data_.geometry_.GetOrigin() + data_.frameOffsets_[frame] * data_.geometry_.GetNormal(), |
303 data_.geometry_.GetAxisX(), | |
304 data_.geometry_.GetAxisY()); | |
746 | 305 } |
306 } | |
307 | |
308 | |
1636 | 309 bool DicomInstanceParameters::IsPlaneWithinSlice(unsigned int frame, |
310 const CoordinateSystem3D& plane) const | |
746 | 311 { |
1636 | 312 if (frame >= data_.numberOfFrames_) |
746 | 313 { |
314 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
315 } | |
316 | |
1636 | 317 CoordinateSystem3D tmp = data_.geometry_; |
746 | 318 |
319 if (frame != 0) | |
320 { | |
321 tmp = GetFrameGeometry(frame); | |
322 } | |
323 | |
324 double distance; | |
325 | |
757 | 326 return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && |
1636 | 327 distance <= data_.sliceThickness_ / 2.0); |
746 | 328 } |
329 | |
1637 | 330 |
331 bool DicomInstanceParameters::IsColor() const | |
332 { | |
333 Orthanc::PhotometricInterpretation photometric = | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
334 GetImageInformation().GetPhotometricInterpretation(); |
1637 | 335 |
336 return (photometric != Orthanc::PhotometricInterpretation_Monochrome1 && | |
337 photometric != Orthanc::PhotometricInterpretation_Monochrome2); | |
338 } | |
339 | |
340 | |
1636 | 341 void DicomInstanceParameters::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, |
342 bool useDouble) const | |
746 | 343 { |
344 if (image.GetFormat() != Orthanc::PixelFormat_Float32) | |
345 { | |
346 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
347 } | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
348 |
1636 | 349 double factor = data_.doseGridScaling_; |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
350 double offset = 0.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
351 |
1636 | 352 if (data_.hasRescale_) |
746 | 353 { |
1636 | 354 factor *= data_.rescaleSlope_; |
355 offset = data_.rescaleIntercept_; | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
356 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
357 |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
358 if (!LinearAlgebra::IsNear(factor, 1) || |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
359 !LinearAlgebra::IsNear(offset, 0)) |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
360 { |
746 | 361 const unsigned int width = image.GetWidth(); |
362 const unsigned int height = image.GetHeight(); | |
363 | |
364 for (unsigned int y = 0; y < height; y++) | |
365 { | |
366 float* p = reinterpret_cast<float*>(image.GetRow(y)); | |
367 | |
368 if (useDouble) | |
369 { | |
370 // Slower, accurate implementation using double | |
371 for (unsigned int x = 0; x < width; x++, p++) | |
372 { | |
373 double value = static_cast<double>(*p); | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
374 *p = static_cast<float>(value * factor + offset); |
746 | 375 } |
376 } | |
377 else | |
378 { | |
379 // Fast, approximate implementation using float | |
380 for (unsigned int x = 0; x < width; x++, p++) | |
381 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
382 *p = (*p) * static_cast<float>(factor) + static_cast<float>(offset); |
746 | 383 } |
384 } | |
385 } | |
386 } | |
387 } | |
388 | |
389 double DicomInstanceParameters::GetRescaleIntercept() const | |
390 { | |
391 if (data_.hasRescale_) | |
392 { | |
393 return data_.rescaleIntercept_; | |
394 } | |
395 else | |
396 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
397 LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; |
746 | 398 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
399 } | |
400 } | |
401 | |
402 | |
403 double DicomInstanceParameters::GetRescaleSlope() const | |
404 { | |
405 if (data_.hasRescale_) | |
406 { | |
407 return data_.rescaleSlope_; | |
408 } | |
409 else | |
410 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
411 LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; |
746 | 412 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
413 } | |
414 } | |
415 | |
416 | |
1637 | 417 Orthanc::PixelFormat DicomInstanceParameters::GetExpectedPixelFormat() const |
418 { | |
419 if (GetSopClassUid() == SopClassUid_RTDose) | |
420 { | |
421 switch (GetImageInformation().GetBitsStored()) | |
422 { | |
423 case 16: | |
424 return Orthanc::PixelFormat_Grayscale16; | |
425 | |
426 case 32: | |
427 return Orthanc::PixelFormat_Grayscale32; | |
428 | |
429 default: | |
430 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
431 } | |
432 } | |
433 else if (IsColor()) | |
434 { | |
435 return Orthanc::PixelFormat_RGB24; | |
436 } | |
437 else if (GetImageInformation().IsSigned()) | |
438 { | |
439 return Orthanc::PixelFormat_SignedGrayscale16; | |
440 } | |
441 else | |
442 { | |
443 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
444 } | |
445 } | |
446 | |
447 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
448 size_t DicomInstanceParameters::GetWindowingPresetsCount() const |
746 | 449 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
450 assert(data_.windowingPresetCenters_.size() == data_.windowingPresetWidths_.size()); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
451 return data_.windowingPresetCenters_.size(); |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
452 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
453 |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
454 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
455 float DicomInstanceParameters::GetWindowingPresetCenter(size_t i) const |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
456 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
457 if (i < GetWindowingPresetsCount()) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
458 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
459 return static_cast<float>(data_.windowingPresetCenters_[i]); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
460 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
461 else |
746 | 462 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
463 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
464 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
465 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
466 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
467 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
468 float DicomInstanceParameters::GetWindowingPresetWidth(size_t i) const |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
469 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
470 if (i < GetWindowingPresetsCount()) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
471 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
472 return static_cast<float>(data_.windowingPresetWidths_[i]); |
746 | 473 } |
474 else | |
475 { | |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
476 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
746 | 477 } |
478 } | |
479 | |
480 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
481 static void GetWindowingBounds(float& low, |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
482 float& high, |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
483 double center, // in |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
484 double width) // in |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
485 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
486 low = static_cast<float>(center - width / 2.0); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
487 high = static_cast<float>(center + width / 2.0); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
488 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
489 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
490 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
491 void DicomInstanceParameters::GetWindowingPresetsUnion(float& center, |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
492 float& width) const |
746 | 493 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
494 assert(tags_.get() != NULL); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
495 size_t s = GetWindowingPresetsCount(); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
496 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
497 if (s > 0) |
746 | 498 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
499 // Use the largest windowing given all the preset windowings |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
500 // that are available in the DICOM tags |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
501 float low, high; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
502 GetWindowingBounds(low, high, GetWindowingPresetCenter(0), GetWindowingPresetWidth(0)); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
503 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
504 for (size_t i = 1; i < s; i++) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
505 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
506 float a, b; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
507 GetWindowingBounds(a, b, GetWindowingPresetCenter(i), GetWindowingPresetWidth(i)); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
508 low = std::min(low, a); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
509 high = std::max(high, b); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
510 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
511 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
512 assert(low <= high); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
513 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
514 if (LinearAlgebra::IsNear(low, high)) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
515 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
516 // Cannot infer a suitable windowing from the available tags |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
517 center = 128.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
518 width = 256.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
519 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
520 else |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
521 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
522 center = (low + high) / 2.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
523 width = (high - low); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
524 } |
746 | 525 } |
526 else | |
527 { | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
528 float a, b; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
529 if (tags_->ParseFloat(a, Orthanc::DICOM_TAG_SMALLEST_IMAGE_PIXEL_VALUE) && |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
530 tags_->ParseFloat(b, Orthanc::DICOM_TAG_LARGEST_IMAGE_PIXEL_VALUE) && |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
531 a < b) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
532 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
533 center = (a + b) / 2.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
534 width = (b - a); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
535 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
536 else |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
537 { |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
538 // Cannot infer a suitable windowing from the available tags |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
539 center = 128.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
540 width = 256.0f; |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
541 } |
746 | 542 } |
543 } | |
544 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
545 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
546 Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
547 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
548 std::unique_ptr<Orthanc::Image> converted(new Orthanc::Image(Orthanc::PixelFormat_Float32, |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
549 pixelData.GetWidth(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
550 pixelData.GetHeight(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
551 false)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
552 Orthanc::ImageProcessing::Convert(*converted, pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
553 |
1287
8e82fdc6200e
Heavy (temporary) logging in the path that leads
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
554 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
555 // Correct rescale slope/intercept if need be |
1636 | 556 //ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); |
557 ApplyRescaleAndDoseScaling(*converted, false); | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
558 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
559 return converted.release(); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
560 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
561 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
562 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
563 TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
564 (const Orthanc::ImageAccessor& pixelData) const |
746 | 565 { |
1353
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
566 // { |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
567 // const Orthanc::ImageAccessor& source = pixelData; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
568 // const void* sourceBuffer = source.GetConstBuffer(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
569 // intptr_t sourceBufferInt = reinterpret_cast<intptr_t>(sourceBuffer); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
570 // int sourceWidth = source.GetWidth(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
571 // int sourceHeight = source.GetHeight(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
572 // int sourcePitch = source.GetPitch(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
573 |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
574 // // TODO: turn error into trace below |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
575 // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
576 // << " W = " << sourceWidth << " H = " << sourceHeight |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
577 // << " P = " << sourcePitch << " B = " << sourceBufferInt |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
578 // << " B % 4 == " << sourceBufferInt % 4; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
579 // } |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
580 |
746 | 581 assert(sizeof(float) == 4); |
582 | |
583 Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); | |
584 | |
585 if (sourceFormat != GetExpectedPixelFormat()) | |
586 { | |
587 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
588 } | |
589 | |
590 if (sourceFormat == Orthanc::PixelFormat_RGB24) | |
591 { | |
592 // This is the case of a color image. No conversion has to be done. | |
593 return new ColorTextureSceneLayer(pixelData); | |
594 } | |
595 else | |
596 { | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
597 // This is the case of a grayscale frame. Convert it to Float32. |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
598 std::unique_ptr<FloatTextureSceneLayer> texture; |
746 | 599 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
600 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
746 | 601 { |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
602 texture.reset(new FloatTextureSceneLayer(pixelData)); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
603 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
604 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
605 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
606 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
746 | 607 texture.reset(new FloatTextureSceneLayer(*converted)); |
608 } | |
609 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
610 if (GetWindowingPresetsCount() > 0) |
746 | 611 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
612 texture->SetCustomWindowing(GetWindowingPresetCenter(0), GetWindowingPresetWidth(0)); |
746 | 613 } |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
614 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
615 switch (GetImageInformation().GetPhotometricInterpretation()) |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
616 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
617 case Orthanc::PhotometricInterpretation_Monochrome1: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
618 texture->SetInverted(true); |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
619 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
620 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
621 case Orthanc::PhotometricInterpretation_Monochrome2: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
622 texture->SetInverted(false); |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
623 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
624 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
625 default: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
626 break; |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
627 } |
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
628 |
746 | 629 return texture.release(); |
630 } | |
631 } | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
632 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
633 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
634 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
635 (const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
636 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
637 std::unique_ptr<FloatTextureSceneLayer> texture; |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
638 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
639 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
640 { |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
641 return new LookupTableTextureSceneLayer(pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
642 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
643 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
644 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
645 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
646 return new LookupTableTextureSceneLayer(*converted); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
647 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
648 } |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
649 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
650 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
651 unsigned int DicomInstanceParameters::GetIndexInSeries() const |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
652 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
653 if (data_.hasIndexInSeries_) |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
654 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
655 return data_.indexInSeries_; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
656 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
657 else |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
658 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
659 LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
660 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
661 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
662 } |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
663 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
664 |
1636 | 665 double DicomInstanceParameters::ApplyRescale(double value) const |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
666 { |
1636 | 667 double factor = data_.doseGridScaling_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
668 double offset = 0.0; |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
669 |
1636 | 670 if (data_.hasRescale_) |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
671 { |
1636 | 672 factor *= data_.rescaleSlope_; |
673 offset = data_.rescaleIntercept_; | |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
674 } |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
675 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
676 return (value * factor + offset); |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
677 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
678 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
679 |
1636 | 680 bool DicomInstanceParameters::ComputeRegularSpacing(double& spacing) const |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
681 { |
1636 | 682 if (data_.frameOffsets_.size() == 0) // Not a RT-DOSE |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
683 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
684 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
685 } |
1636 | 686 else if (data_.frameOffsets_.size() == 1) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
687 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
688 spacing = 1; // Edge case: RT-DOSE with one single frame |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
689 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
690 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
691 else |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
692 { |
1636 | 693 assert(data_.frameOffsets_.size() == GetNumberOfFrames()); |
694 | |
695 spacing = std::abs(data_.frameOffsets_[1] - data_.frameOffsets_[0]); | |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
696 |
1636 | 697 for (size_t i = 1; i + 1 < data_.frameOffsets_.size(); i++) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
698 { |
1636 | 699 double s = data_.frameOffsets_[i + 1] - data_.frameOffsets_[i]; |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
700 if (!LinearAlgebra::IsNear(spacing, s, 0.001)) |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
701 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
702 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
703 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
704 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
705 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
706 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
707 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
708 } |
1822
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
709 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
710 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
711 void DicomInstanceParameters::SetPixelSpacing(double pixelSpacingX, |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
712 double pixelSpacingY) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
713 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
714 data_.hasPixelSpacing_ = true; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
715 data_.pixelSpacingX_ = pixelSpacingX; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
716 data_.pixelSpacingY_ = pixelSpacingY; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
717 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
718 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
719 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
720 static const Json::Value* LookupDicomWebSingleValue(const Json::Value& dicomweb, |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
721 const std::string& tag, |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
722 const std::string& vr) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
723 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
724 static const char* const VALUE = "Value"; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
725 static const char* const VR = "vr"; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
726 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
727 if (dicomweb.type() == Json::objectValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
728 dicomweb.isMember(tag) && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
729 dicomweb[tag].type() == Json::objectValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
730 dicomweb[tag].isMember(VALUE) && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
731 dicomweb[tag].isMember(VR) && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
732 dicomweb[tag][VR].type() == Json::stringValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
733 dicomweb[tag][VR].asString() == vr && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
734 dicomweb[tag][VALUE].type() == Json::arrayValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
735 dicomweb[tag][VALUE].size() == 1u) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
736 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
737 return &dicomweb[tag][VALUE][0]; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
738 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
739 else |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
740 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
741 return NULL; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
742 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
743 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
744 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
745 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
746 void DicomInstanceParameters::EnrichUsingDicomWeb(const Json::Value& dicomweb) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
747 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
748 /** |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
749 * Use DICOM tag "SequenceOfUltrasoundRegions" (0018,6011) in |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
750 * order to derive the pixel spacing on ultrasound (US) images |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
751 **/ |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
752 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
753 if (!data_.hasPixelSpacing_) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
754 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
755 const Json::Value* region = LookupDicomWebSingleValue(dicomweb, "00186011", "SQ"); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
756 if (region != NULL) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
757 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
758 const Json::Value* physicalUnitsXDirection = LookupDicomWebSingleValue(*region, "00186024", "US"); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
759 const Json::Value* physicalUnitsYDirection = LookupDicomWebSingleValue(*region, "00186026", "US"); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
760 const Json::Value* physicalDeltaX = LookupDicomWebSingleValue(*region, "0018602C", "FD"); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
761 const Json::Value* physicalDeltaY = LookupDicomWebSingleValue(*region, "0018602E", "FD"); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
762 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
763 if (physicalUnitsXDirection != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
764 physicalUnitsYDirection != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
765 physicalDeltaX != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
766 physicalDeltaY != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
767 physicalUnitsXDirection->type() == Json::intValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
768 physicalUnitsYDirection->type() == Json::intValue && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
769 physicalUnitsXDirection->asInt() == 0x0003 && // Centimeters |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
770 physicalUnitsYDirection->asInt() == 0x0003 && // Centimeters |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
771 physicalDeltaX->isNumeric() && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
772 physicalDeltaY->isNumeric()) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
773 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
774 // Scene coordinates are expressed in millimeters => multiplication by 10 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
775 SetPixelSpacing(10.0 * physicalDeltaX->asDouble(), |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
776 10.0 * physicalDeltaY->asDouble()); |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
777 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
778 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
779 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
780 } |
746 | 781 } |