Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/Toolbox/DicomInstanceParameters.cpp @ 2169:fe5406abd43f
added separate class Windowing
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 21 Oct 2024 15:40:34 +0200 |
parents | 16c01cc201e7 |
children | 8e3c403cc643 |
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 | |
2124
16c01cc201e7
updated copyright, as Osimis is not active on Orthanc anymore
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2114
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
2114
c23eef785569
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2077
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
746 | 7 * |
8 * 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
|
9 * modify it under the terms of the GNU Lesser General Public License |
746 | 10 * as published by the Free Software Foundation, either version 3 of |
11 * the License, or (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, but | |
14 * 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
|
15 * 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
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1571
diff
changeset
|
17 * |
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
|
18 * 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
|
19 * 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
|
20 * <http://www.gnu.org/licenses/>. |
746 | 21 **/ |
22 | |
23 | |
24 #include "DicomInstanceParameters.h" | |
25 | |
26 #include "../Scene2D/ColorTextureSceneLayer.h" | |
27 #include "../Scene2D/FloatTextureSceneLayer.h" | |
1750 | 28 #include "GeometryToolbox.h" |
29 #include "ImageToolbox.h" | |
746 | 30 |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
31 #include <Images/Image.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
32 #include <Images/ImageProcessing.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
33 #include <Logging.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
34 #include <OrthancException.h> |
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1353
diff
changeset
|
35 #include <Toolbox.h> |
746 | 36 |
37 | |
38 namespace OrthancStone | |
39 { | |
1636 | 40 static void ExtractFrameOffsets(Vector& target, |
41 const Orthanc::DicomMap& dicom, | |
42 unsigned int numberOfFrames) | |
746 | 43 { |
44 // http://dicom.nema.org/medical/Dicom/2016a/output/chtml/part03/sect_C.8.8.3.2.html | |
45 | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
46 std::string increment; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
47 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
48 if (dicom.LookupStringValue(increment, Orthanc::DICOM_TAG_FRAME_INCREMENT_POINTER, false)) |
746 | 49 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
50 Orthanc::Toolbox::ToUpperCase(increment); |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
51 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
52 // 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
|
53 // 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
|
54 if (increment != "3004,000C") |
746 | 55 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
56 LOG(WARNING) << "Bad value for the FrameIncrementPointer tags in a multiframe image"; |
1636 | 57 target.resize(0); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
58 return; |
746 | 59 } |
60 } | |
61 | |
1636 | 62 if (!LinearAlgebra::ParseVector(target, dicom, Orthanc::DICOM_TAG_GRID_FRAME_OFFSET_VECTOR) || |
63 target.size() != numberOfFrames) | |
746 | 64 { |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
65 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
|
66 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
67 // DO NOT use ".clear()" here, as the "Vector" class doesn't behave like std::vector! |
1636 | 68 target.resize(0); |
746 | 69 } |
70 } | |
71 | |
72 | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
73 DicomInstanceParameters::Data::Data(const Orthanc::DicomMap& dicom) |
746 | 74 { |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
75 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
|
76 !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
|
77 !dicom.LookupStringValue(sopInstanceUid_, Orthanc::DICOM_TAG_SOP_INSTANCE_UID, false)) |
746 | 78 { |
79 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat); | |
80 } | |
81 | |
82 std::string s; | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
83 if (dicom.LookupStringValue(s, Orthanc::DICOM_TAG_SOP_CLASS_UID, false)) |
746 | 84 { |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
85 sopClassUid_ = StringToSopClassUid(s); |
746 | 86 } |
87 else | |
88 { | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
89 sopClassUid_ = SopClassUid_Other; |
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 |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
92 uint32_t n; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
93 if (dicom.ParseUnsignedInteger32(n, Orthanc::DICOM_TAG_NUMBER_OF_FRAMES)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
94 { |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
95 hasNumberOfFrames_ = true; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
96 numberOfFrames_ = n; |
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 else |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
99 { |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
100 hasNumberOfFrames_ = false; |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
101 numberOfFrames_ = 1; |
746 | 102 } |
103 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
104 if (!dicom.HasTag(Orthanc::DICOM_TAG_COLUMNS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
105 !dicom.GetValue(Orthanc::DICOM_TAG_COLUMNS).ParseFirstUnsignedInteger(width_)) |
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 width_ = 0; |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
108 } |
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 if (!dicom.HasTag(Orthanc::DICOM_TAG_ROWS) || |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
111 !dicom.GetValue(Orthanc::DICOM_TAG_ROWS).ParseFirstUnsignedInteger(height_)) |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
112 { |
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
113 height_ = 0; |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
114 } |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
115 |
1746
4bedae500652
Automatically compute SliceThickness from
Benjamin Golinvaux <bgo@osimis.io>
parents:
1739
diff
changeset
|
116 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
117 if (dicom.ParseDouble(sliceThickness_, Orthanc::DICOM_TAG_SLICE_THICKNESS)) |
746 | 118 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
119 hasSliceThickness_ = true; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
120 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
121 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
122 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
123 hasSliceThickness_ = false; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
124 |
1772
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
125 if (numberOfFrames_ > 1) |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
126 { |
6c246f862b00
unit test VolumeRendering.Basic
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1750
diff
changeset
|
127 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
|
128 } |
746 | 129 } |
130 | |
1821
36430d73e36c
introducing measure units in AnnotationsSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1817
diff
changeset
|
131 hasPixelSpacing_ = GeometryToolbox::GetPixelSpacing(pixelSpacingX_, pixelSpacingY_, dicom); |
746 | 132 |
133 std::string position, orientation; | |
994
1f74bc3459ba
fix build due to rename in Orthanc::DicomMap
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
980
diff
changeset
|
134 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
|
135 dicom.LookupStringValue(orientation, Orthanc::DICOM_TAG_IMAGE_ORIENTATION_PATIENT, false)) |
746 | 136 { |
137 geometry_ = CoordinateSystem3D(position, orientation); | |
138 } | |
139 | |
1635
1a714e21ea7c
start refactoring DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1634
diff
changeset
|
140 // Must be AFTER setting "numberOfFrames_" |
1639 | 141 if (numberOfFrames_ > 1) |
142 { | |
143 ExtractFrameOffsets(frameOffsets_, dicom, numberOfFrames_); | |
144 } | |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
145 |
746 | 146 if (sopClassUid_ == SopClassUid_RTDose) |
147 { | |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
148 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
|
149 |
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
150 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
|
151 { |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
152 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
|
153 doseUnits_.clear(); |
1091
5a18e6a395bc
Added DoseUnit tag retrieval to DicomInstanceParameters
Benjamin Golinvaux <bgo@osimis.io>
parents:
1027
diff
changeset
|
154 } |
746 | 155 } |
156 | |
157 if (dicom.ParseDouble(rescaleIntercept_, Orthanc::DICOM_TAG_RESCALE_INTERCEPT) && | |
158 dicom.ParseDouble(rescaleSlope_, Orthanc::DICOM_TAG_RESCALE_SLOPE)) | |
159 { | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
160 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
|
161 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
162 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
|
163 // 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
|
164 hasRescale_ = false; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
165 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
166 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
167 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
168 hasRescale_ = true; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
169 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
170 |
746 | 171 } |
172 else | |
173 { | |
174 hasRescale_ = false; | |
175 } | |
176 | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
177 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
|
178 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
179 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
|
180 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
181 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
|
182 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
183 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
184 else |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
185 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
186 doseGridScaling_ = 1.0; |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
187 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
|
188 { |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
189 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
|
190 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
191 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
192 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
193 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
194 windowingPresets_.clear(); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
195 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
196 Vector centers, widths; |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
197 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
198 if (LinearAlgebra::ParseVector(centers, dicom, Orthanc::DICOM_TAG_WINDOW_CENTER) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
199 LinearAlgebra::ParseVector(widths, dicom, Orthanc::DICOM_TAG_WINDOW_WIDTH)) |
746 | 200 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
201 if (centers.size() == widths.size()) |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
202 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
203 windowingPresets_.resize(centers.size()); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
204 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
205 for (size_t i = 0; i < centers.size(); i++) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
206 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
207 windowingPresets_[i] = Windowing(centers[i], widths[i]); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
208 } |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
209 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
210 else |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
211 { |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
212 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
|
213 } |
746 | 214 } |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
215 |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
216 // This computes the "IndexInSeries" metadata from Orthanc (check |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
217 // out "Orthanc::ServerIndex::Store()") |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
218 hasIndexInSeries_ = ( |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
219 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
220 dicom.ParseUnsignedInteger32(indexInSeries_, Orthanc::DICOM_TAG_IMAGE_INDEX)); |
1646
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
221 |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
222 if (!dicom.LookupStringValue( |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
223 frameOfReferenceUid_, Orthanc::DICOM_TAG_FRAME_OF_REFERENCE_UID, false)) |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
224 { |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
225 frameOfReferenceUid_.clear(); |
4e14735e98f8
preparing to remove FrameExtent
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1642
diff
changeset
|
226 } |
1846
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
227 |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
228 if (!dicom.HasTag(Orthanc::DICOM_TAG_INSTANCE_NUMBER) || |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
229 !dicom.GetValue(Orthanc::DICOM_TAG_INSTANCE_NUMBER).ParseInteger32(instanceNumber_)) |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
230 { |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
231 instanceNumber_ = 0; |
2789b4b0e0a8
DicomInstanceParameters::HasNumberOfFrames() and DicomInstanceParameters::GetInstanceNumber()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1822
diff
changeset
|
232 } |
746 | 233 } |
234 | |
235 | |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
236 double DicomInstanceParameters::GetSliceThickness() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
237 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
238 if (data_.hasSliceThickness_) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
239 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
240 return data_.sliceThickness_; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
241 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
242 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
243 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
244 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
245 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
246 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
247 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
248 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
249 const Orthanc::DicomImageInformation& DicomInstanceParameters::GetImageInformation() const |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
250 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
251 assert(tags_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
252 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
253 if (imageInformation_.get() == NULL) |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
254 { |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
255 const_cast<DicomInstanceParameters&>(*this).imageInformation_. |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
256 reset(new Orthanc::DicomImageInformation(GetTags())); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
257 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
258 assert(imageInformation_->GetWidth() == GetWidth()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
259 assert(imageInformation_->GetHeight() == GetHeight()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
260 assert(imageInformation_->GetNumberOfFrames() == GetNumberOfFrames()); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
261 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
262 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
263 assert(imageInformation_.get() != NULL); |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
264 return *imageInformation_; |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
265 } |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
266 |
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
267 |
1636 | 268 CoordinateSystem3D DicomInstanceParameters::GetFrameGeometry(unsigned int frame) const |
746 | 269 { |
1636 | 270 if (frame >= data_.numberOfFrames_) |
746 | 271 { |
272 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
273 } | |
1636 | 274 else if (data_.frameOffsets_.empty()) |
746 | 275 { |
1636 | 276 return data_.geometry_; |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
277 } |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
278 else |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
279 { |
1636 | 280 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
746 | 281 |
282 return CoordinateSystem3D( | |
1636 | 283 data_.geometry_.GetOrigin() + data_.frameOffsets_[frame] * data_.geometry_.GetNormal(), |
284 data_.geometry_.GetAxisX(), | |
285 data_.geometry_.GetAxisY()); | |
746 | 286 } |
287 } | |
288 | |
289 | |
1636 | 290 bool DicomInstanceParameters::IsPlaneWithinSlice(unsigned int frame, |
291 const CoordinateSystem3D& plane) const | |
746 | 292 { |
1636 | 293 if (frame >= data_.numberOfFrames_) |
746 | 294 { |
295 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
296 } | |
297 | |
1636 | 298 CoordinateSystem3D tmp = data_.geometry_; |
746 | 299 |
300 if (frame != 0) | |
301 { | |
302 tmp = GetFrameGeometry(frame); | |
303 } | |
304 | |
305 double distance; | |
306 | |
757 | 307 return (CoordinateSystem3D::ComputeDistance(distance, tmp, plane) && |
1636 | 308 distance <= data_.sliceThickness_ / 2.0); |
746 | 309 } |
310 | |
1637 | 311 |
312 bool DicomInstanceParameters::IsColor() const | |
313 { | |
314 Orthanc::PhotometricInterpretation photometric = | |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
315 GetImageInformation().GetPhotometricInterpretation(); |
1637 | 316 |
317 return (photometric != Orthanc::PhotometricInterpretation_Monochrome1 && | |
318 photometric != Orthanc::PhotometricInterpretation_Monochrome2); | |
319 } | |
320 | |
321 | |
1636 | 322 void DicomInstanceParameters::ApplyRescaleAndDoseScaling(Orthanc::ImageAccessor& image, |
323 bool useDouble) const | |
746 | 324 { |
325 if (image.GetFormat() != Orthanc::PixelFormat_Float32) | |
326 { | |
327 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
328 } | |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
329 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
330 double scaling = data_.doseGridScaling_; |
1141
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
331 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
|
332 |
1636 | 333 if (data_.hasRescale_) |
746 | 334 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
335 scaling *= data_.rescaleSlope_; |
1636 | 336 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
|
337 } |
7681f3943748
Changed handling of DoseGridScaling: before this commit, rescaleSlope was set to
Benjamin Golinvaux <bgo@osimis.io>
parents:
1091
diff
changeset
|
338 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
339 Orthanc::ImageProcessing::ShiftScale2(image, offset, scaling, false); |
746 | 340 } |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
341 |
746 | 342 |
343 double DicomInstanceParameters::GetRescaleIntercept() const | |
344 { | |
345 if (data_.hasRescale_) | |
346 { | |
347 return data_.rescaleIntercept_; | |
348 } | |
349 else | |
350 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
351 LOG(ERROR) << "DicomInstanceParameters::GetRescaleIntercept(): !data_.hasRescale_"; |
746 | 352 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
353 } | |
354 } | |
355 | |
356 | |
357 double DicomInstanceParameters::GetRescaleSlope() const | |
358 { | |
359 if (data_.hasRescale_) | |
360 { | |
361 return data_.rescaleSlope_; | |
362 } | |
363 else | |
364 { | |
956
a7351ad54960
Made IsContextLost automatically set the flag by checking with the emscripten
Benjamin Golinvaux <bgo@osimis.io>
parents:
949
diff
changeset
|
365 LOG(ERROR) << "DicomInstanceParameters::GetRescaleSlope(): !data_.hasRescale_"; |
746 | 366 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
367 } | |
368 } | |
369 | |
370 | |
1637 | 371 Orthanc::PixelFormat DicomInstanceParameters::GetExpectedPixelFormat() const |
372 { | |
373 if (GetSopClassUid() == SopClassUid_RTDose) | |
374 { | |
375 switch (GetImageInformation().GetBitsStored()) | |
376 { | |
377 case 16: | |
378 return Orthanc::PixelFormat_Grayscale16; | |
379 | |
380 case 32: | |
381 return Orthanc::PixelFormat_Grayscale32; | |
382 | |
383 default: | |
384 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
385 } | |
386 } | |
387 else if (IsColor()) | |
388 { | |
389 return Orthanc::PixelFormat_RGB24; | |
390 } | |
391 else if (GetImageInformation().IsSigned()) | |
392 { | |
393 return Orthanc::PixelFormat_SignedGrayscale16; | |
394 } | |
395 else | |
396 { | |
397 return Orthanc::PixelFormat_Grayscale16; // Rough guess | |
398 } | |
399 } | |
400 | |
401 | |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
402 Windowing DicomInstanceParameters::GetFallbackWindowing() const |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
403 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
404 double a, b; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
405 if (tags_->ParseDouble(a, Orthanc::DICOM_TAG_SMALLEST_IMAGE_PIXEL_VALUE) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
406 tags_->ParseDouble(b, Orthanc::DICOM_TAG_LARGEST_IMAGE_PIXEL_VALUE)) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
407 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
408 const double center = (a + b) / 2.0f; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
409 const double width = (b - a); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
410 return Windowing(center, width); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
411 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
412 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
413 // Added in Stone Web viewer > 2.5 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
414 uint32_t bitsStored, pixelRepresentation; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
415 if (tags_->ParseUnsignedInteger32(bitsStored, Orthanc::DICOM_TAG_BITS_STORED) && |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
416 tags_->ParseUnsignedInteger32(pixelRepresentation, Orthanc::DICOM_TAG_PIXEL_REPRESENTATION)) |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
417 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
418 const bool isSigned = (pixelRepresentation != 0); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
419 const float maximum = powf(2.0, bitsStored); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
420 return Windowing(isSigned ? 0.0f : maximum / 2.0f, maximum); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
421 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
422 else |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
423 { |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
424 // Cannot infer a suitable windowing from the available tags |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
425 return Windowing(); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
426 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
427 } |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
428 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
429 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
430 size_t DicomInstanceParameters::GetWindowingPresetsCount() const |
746 | 431 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
432 return data_.windowingPresets_.size(); |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
433 } |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
434 |
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
435 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
436 Windowing DicomInstanceParameters::GetWindowingPreset(size_t i) const |
1677
51bab5188a13
start multiple preset windowings
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1646
diff
changeset
|
437 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
438 if (i < GetWindowingPresetsCount()) |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
439 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
440 return data_.windowingPresets_[i]; |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
441 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
442 else |
746 | 443 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
444 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
445 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
446 } |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
447 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
448 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
449 Windowing DicomInstanceParameters::GetWindowingPresetsUnion() const |
746 | 450 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
451 assert(tags_.get() != NULL); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
452 size_t s = GetWindowingPresetsCount(); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
453 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
454 if (s > 0) |
746 | 455 { |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
456 // 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
|
457 // that are available in the DICOM tags |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
458 double low, high; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
459 GetWindowingPreset(0).GetBounds(low, high); |
1679
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 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
|
462 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
463 double a, b; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
464 GetWindowingPreset(i).GetBounds(a, b); |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
465 low = std::min(low, a); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
466 high = std::max(high, b); |
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 |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
469 assert(low <= high); |
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
470 |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
471 if (!LinearAlgebra::IsNear(low, high)) |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
472 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
473 const double center = (low + high) / 2.0f; |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
474 const double width = (high - low); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
475 return Windowing(center, width); |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
476 } |
746 | 477 } |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
478 |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
479 // No preset, or presets with an empty range |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
480 return GetFallbackWindowing(); |
746 | 481 } |
482 | |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
483 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
484 Orthanc::ImageAccessor* DicomInstanceParameters::ConvertToFloat(const Orthanc::ImageAccessor& pixelData) const |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
485 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
486 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
|
487 pixelData.GetWidth(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
488 pixelData.GetHeight(), |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
489 false)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
490 Orthanc::ImageProcessing::Convert(*converted, pixelData); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
491 |
1287
8e82fdc6200e
Heavy (temporary) logging in the path that leads
Benjamin Golinvaux <bgo@osimis.io>
parents:
1270
diff
changeset
|
492 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
493 // Correct rescale slope/intercept if need be |
1636 | 494 //ApplyRescaleAndDoseScaling(*converted, (pixelData.GetFormat() == Orthanc::PixelFormat_Grayscale32)); |
495 ApplyRescaleAndDoseScaling(*converted, false); | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
496 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
497 return converted.release(); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
498 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
499 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
500 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
501 TextureBaseSceneLayer* DicomInstanceParameters::CreateTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
502 const Orthanc::ImageAccessor& pixelData) const |
746 | 503 { |
1353
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
504 // { |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
505 // const Orthanc::ImageAccessor& source = pixelData; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
506 // const void* sourceBuffer = source.GetConstBuffer(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
507 // intptr_t sourceBufferInt = reinterpret_cast<intptr_t>(sourceBuffer); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
508 // int sourceWidth = source.GetWidth(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
509 // int sourceHeight = source.GetHeight(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
510 // int sourcePitch = source.GetPitch(); |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
511 |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
512 // // TODO: turn error into trace below |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
513 // LOG(ERROR) << "ConvertGrayscaleToFloat | source:" |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
514 // << " W = " << sourceWidth << " H = " << sourceHeight |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
515 // << " P = " << sourcePitch << " B = " << sourceBufferInt |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
516 // << " B % 4 == " << sourceBufferInt % 4; |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
517 // } |
af65bce18951
Dummy commented debug block
Benjamin Golinvaux <bgo@osimis.io>
parents:
1300
diff
changeset
|
518 |
746 | 519 assert(sizeof(float) == 4); |
520 | |
521 Orthanc::PixelFormat sourceFormat = pixelData.GetFormat(); | |
522 | |
523 if (sourceFormat != GetExpectedPixelFormat()) | |
524 { | |
525 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); | |
526 } | |
527 | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
528 std::unique_ptr<TextureBaseSceneLayer> texture; |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
529 |
746 | 530 if (sourceFormat == Orthanc::PixelFormat_RGB24) |
531 { | |
532 // This is the case of a color image. No conversion has to be done. | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
533 texture.reset(new ColorTextureSceneLayer(pixelData)); |
746 | 534 } |
535 else | |
536 { | |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
537 // This is the case of a grayscale frame. Convert it to Float32. |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
538 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
746 | 539 { |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
540 texture.reset(new FloatTextureSceneLayer(pixelData)); |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
541 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
542 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
543 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
544 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
746 | 545 texture.reset(new FloatTextureSceneLayer(*converted)); |
546 } | |
547 | |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
548 FloatTextureSceneLayer& floatTexture = dynamic_cast<FloatTextureSceneLayer&>(*texture); |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
549 |
1679
5b8b88e5bfd6
successfully running unit tests in WebAssembly
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1677
diff
changeset
|
550 if (GetWindowingPresetsCount() > 0) |
746 | 551 { |
2169
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
552 Windowing preset = GetWindowingPreset(0); |
fe5406abd43f
added separate class Windowing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2124
diff
changeset
|
553 floatTexture.SetCustomWindowing(preset.GetCenter(), preset.GetWidth()); |
746 | 554 } |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
555 |
1642
5cc589bfb385
lazy computation of DicomInstanceParameters::GetImageInformation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1639
diff
changeset
|
556 switch (GetImageInformation().GetPhotometricInterpretation()) |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
557 { |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
558 case Orthanc::PhotometricInterpretation_Monochrome1: |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
559 floatTexture.SetInverted(true); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
560 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
561 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
562 case Orthanc::PhotometricInterpretation_Monochrome2: |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
563 floatTexture.SetInverted(false); |
1634
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
564 break; |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
565 |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
566 default: |
a4418a489e86
improving robustness of DicomInstanceParameters
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1598
diff
changeset
|
567 break; |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
568 } |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
569 } |
1206
c93a6218f0cd
Fixed photometric interpretation in texture creation
Benjamin Golinvaux <bgo@osimis.io>
parents:
1141
diff
changeset
|
570 |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
571 if (HasPixelSpacing()) |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
572 { |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
573 texture->SetPixelSpacing(GetPixelSpacingX(), GetPixelSpacingY()); |
746 | 574 } |
1911
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
575 |
898774b4e02d
DicomInstanceParameters::CreateTexture() now sets pixel spacing
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
576 return texture.release(); |
746 | 577 } |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
578 |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
579 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
580 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateLookupTableTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
581 const Orthanc::ImageAccessor& pixelData) const |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
582 { |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
583 std::unique_ptr<LookupTableTextureSceneLayer> texture; |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
584 |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
585 if (pixelData.GetFormat() == Orthanc::PixelFormat_Float32) |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
586 { |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
587 texture.reset(new LookupTableTextureSceneLayer(pixelData)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
588 } |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
589 else |
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
590 { |
1298
8a0a62189f46
replacing std::auto_ptr by std::unique_ptr
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1291
diff
changeset
|
591 std::unique_ptr<Orthanc::ImageAccessor> converted(ConvertToFloat(pixelData)); |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
592 texture.reset(new LookupTableTextureSceneLayer(*converted)); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
593 } |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
594 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
595 if (HasPixelSpacing()) |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
596 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
597 texture->SetPixelSpacing(GetPixelSpacingX(), GetPixelSpacingY()); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
598 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
599 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
600 return texture.release(); |
768
55411e7da2f7
LookupTableTextureSceneLayer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
762
diff
changeset
|
601 } |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
602 |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
603 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
604 LookupTableTextureSceneLayer* DicomInstanceParameters::CreateOverlayTexture( |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
605 int originX, |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
606 int originY, |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
607 const Orthanc::ImageAccessor& overlay) const |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
608 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
609 if (overlay.GetFormat() != Orthanc::PixelFormat_Grayscale8) |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
610 { |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
611 throw Orthanc::OrthancException(Orthanc::ErrorCode_IncompatibleImageFormat); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
612 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
613 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
614 std::unique_ptr<LookupTableTextureSceneLayer> texture(CreateLookupTableTexture(overlay)); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
615 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
616 texture->SetOrigin(static_cast<double>(originX - 1) * texture->GetPixelSpacingX(), |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
617 static_cast<double>(originY - 1) * texture->GetPixelSpacingY()); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
618 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
619 std::vector<uint8_t> lut(4 * 256); |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
620 for (size_t i = 0; i < 256; i++) |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
621 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
622 if (i < 127) |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
623 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
624 // Black pixels are converted to transparent pixels |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
625 lut[4 * i] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
626 lut[4 * i + 1] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
627 lut[4 * i + 2] = 0; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
628 lut[4 * i + 3] = 0; // alpha |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
629 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
630 else |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
631 { |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
632 // White pixels are converted to opaque white |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
633 lut[4 * i] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
634 lut[4 * i + 1] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
635 lut[4 * i + 2] = 255; |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
636 lut[4 * i + 3] = 255; // alpha |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
637 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
638 } |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
639 |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
640 texture->SetLookupTable(lut); |
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
641 |
1919
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
642 return texture.release(); |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
643 } |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
644 |
ed4831e08961
added DicomInstanceParameters::CreateOverlayTexture()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1911
diff
changeset
|
645 |
980
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
646 unsigned int DicomInstanceParameters::GetIndexInSeries() const |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
647 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
648 if (data_.hasIndexInSeries_) |
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 return data_.indexInSeries_; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
651 } |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
652 else |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
653 { |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
654 LOG(ERROR) << "DicomInstanceParameters::GetIndexInSeries(): !data_.hasIndexInSeries_"; |
8e497a4e3d96
DicomInstanceParameters::GetIndexInSeries()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
956
diff
changeset
|
655 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); |
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 } |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
658 |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
659 |
1636 | 660 double DicomInstanceParameters::ApplyRescale(double value) const |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
661 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
662 double scaling = data_.doseGridScaling_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
663 double offset = 0.0; |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
664 |
1636 | 665 if (data_.hasRescale_) |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
666 { |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
667 scaling *= data_.rescaleSlope_; |
1636 | 668 offset = data_.rescaleIntercept_; |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
669 } |
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
670 |
1924
f4050908c6bc
display of overlays
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1919
diff
changeset
|
671 return (value * scaling + offset); |
1159
acb399643945
DicomInstanceParameters::ApplyRescale()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1141
diff
changeset
|
672 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
673 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
674 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
675 bool DicomInstanceParameters::ComputeFrameOffsetsSpacing(double& spacing) const |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
676 { |
1636 | 677 if (data_.frameOffsets_.size() == 0) // Not a RT-DOSE |
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 return false; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
680 } |
1636 | 681 else if (data_.frameOffsets_.size() == 1) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
682 { |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
683 spacing = 1; // Edge case: RT-DOSE with one single frame |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
684 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
685 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
686 else |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
687 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
688 static double THRESHOLD = 0.001; |
1636 | 689 |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
690 if (data_.frameOffsets_.size() != GetNumberOfFrames()) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
691 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
692 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
693 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
694 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
695 double a = 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 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
699 double b = data_.frameOffsets_[i + 1] - data_.frameOffsets_[i]; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
700 if (!LinearAlgebra::IsNear(a, b, THRESHOLD)) |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
701 { |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
702 LOG(ERROR) << "Unable to extract slice thickness from GridFrameOffsetVector (3004,000C) (reason: varying spacing)"; |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
703 return false; |
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 } |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
706 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
707 spacing = std::abs(a); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
708 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
709 if (HasSliceThickness() && |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
710 !LinearAlgebra::IsNear(spacing, GetSliceThickness(), THRESHOLD)) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
711 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
712 LOG(WARNING) << "SliceThickness and GridFrameOffsetVector (3004,000C) do not match"; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
713 } |
1161
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
714 |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
715 return true; |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
716 } |
19b1c8caade4
fix sagittal geometry
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1159
diff
changeset
|
717 } |
1822
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 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
|
721 double pixelSpacingY) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
722 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
723 data_.hasPixelSpacing_ = true; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
724 data_.pixelSpacingX_ = pixelSpacingX; |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
725 data_.pixelSpacingY_ = pixelSpacingY; |
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 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
728 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
729 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
|
730 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
|
731 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
|
732 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
733 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
|
734 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
|
735 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
736 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
|
737 dicomweb.isMember(tag) && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
738 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
|
739 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
|
740 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
|
741 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
|
742 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
|
743 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
|
744 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
|
745 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
746 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
|
747 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
748 else |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
749 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
750 return NULL; |
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 |
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 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
|
756 { |
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 * 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
|
759 * 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
|
760 **/ |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
761 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
762 if (!data_.hasPixelSpacing_) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
763 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
764 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
|
765 if (region != NULL) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
766 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
767 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
|
768 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
|
769 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
|
770 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
|
771 |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
772 if (physicalUnitsXDirection != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
773 physicalUnitsYDirection != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
774 physicalDeltaX != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
775 physicalDeltaY != NULL && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
776 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
|
777 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
|
778 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
|
779 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
|
780 physicalDeltaX->isNumeric() && |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
781 physicalDeltaY->isNumeric()) |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
782 { |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
783 // 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
|
784 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
|
785 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
|
786 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
787 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
788 } |
0489fe25ce48
support of pixel spacing in ultrasound images from tag SequenceOfUltrasoundRegions
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1821
diff
changeset
|
789 } |
2076
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
790 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
791 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
792 CoordinateSystem3D DicomInstanceParameters::GetMultiFrameGeometry() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
793 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
794 if (data_.frameOffsets_.empty()) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
795 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
796 return data_.geometry_; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
797 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
798 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
799 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
800 assert(data_.frameOffsets_.size() == data_.numberOfFrames_); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
801 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
802 double lowest = data_.frameOffsets_[0]; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
803 for (size_t i = 1; i < data_.frameOffsets_.size(); i++) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
804 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
805 lowest = std::min(lowest, data_.frameOffsets_[i]); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
806 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
807 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
808 return CoordinateSystem3D( |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
809 data_.geometry_.GetOrigin() + lowest * data_.geometry_.GetNormal(), |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
810 data_.geometry_.GetAxisX(), |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
811 data_.geometry_.GetAxisY()); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
812 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
813 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
814 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
815 |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
816 bool DicomInstanceParameters::IsReversedFrameOffsets() const |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
817 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
818 if (data_.frameOffsets_.size() < 2) |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
819 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
820 return false; |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
821 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
822 else |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
823 { |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
824 return (data_.frameOffsets_[0] > data_.frameOffsets_[1]); |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
825 } |
990f396484b1
fix rendering of RT-DOSE with negative GridFrameOffsetVector
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2075
diff
changeset
|
826 } |
746 | 827 } |