Mercurial > hg > orthanc-stone
comparison UnitTestsSources/VolumeRenderingTests.cpp @ 1772:6c246f862b00
unit test VolumeRendering.Basic
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 12 May 2021 17:24:24 +0200 |
parents | f302bbddf94d |
children | 95ece40bb298 |
comparison
equal
deleted
inserted
replaced
1771:f302bbddf94d | 1772:6c246f862b00 |
---|---|
17 * You should have received a copy of the GNU Affero General Public License | 17 * You should have received a copy of the GNU Affero General Public License |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | 19 **/ |
20 | 20 |
21 | 21 |
22 #include "../OrthancStone/Sources/Scene2D/CairoCompositor.h" | |
23 #include "../OrthancStone/Sources/Scene2D/CopyStyleConfigurator.h" | |
24 #include "../OrthancStone/Sources/Volumes/DicomVolumeImageMPRSlicer.h" | |
25 #include "../OrthancStone/Sources/Volumes/DicomVolumeImageReslicer.h" | |
26 | |
27 #include <Images/ImageProcessing.h> | |
28 #include <Images/ImageTraits.h> | |
29 | |
22 #include <gtest/gtest.h> | 30 #include <gtest/gtest.h> |
23 | 31 |
24 TEST(VolumeRendering, Basic) | 32 TEST(VolumeRendering, Basic) |
25 { | 33 { |
34 Orthanc::DicomMap dicom; | |
35 dicom.SetValue(Orthanc::DICOM_TAG_STUDY_INSTANCE_UID, "study", false); | |
36 dicom.SetValue(Orthanc::DICOM_TAG_SERIES_INSTANCE_UID, "series", false); | |
37 dicom.SetValue(Orthanc::DICOM_TAG_SOP_INSTANCE_UID, "sop", false); | |
38 | |
39 OrthancStone::CoordinateSystem3D axial(OrthancStone::LinearAlgebra::CreateVector(-0.5, -0.5, 0), | |
40 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), | |
41 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); | |
42 | |
43 OrthancStone::VolumeImageGeometry geometry; | |
44 geometry.SetSizeInVoxels(3, 3, 1); | |
45 geometry.SetAxialGeometry(axial); | |
46 | |
47 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume(new OrthancStone::DicomVolumeImage); | |
48 volume->Initialize(geometry, Orthanc::PixelFormat_Grayscale8, false); | |
49 volume->SetDicomParameters(OrthancStone::DicomInstanceParameters(dicom)); | |
50 | |
51 { | |
52 OrthancStone::ImageBuffer3D::SliceWriter writer(volume->GetPixelData(), OrthancStone::VolumeProjection_Axial, 0); | |
53 unsigned int v = 0; | |
54 for (unsigned int y = 0; y < writer.GetAccessor().GetHeight(); y++) | |
55 { | |
56 uint8_t *p = reinterpret_cast<uint8_t*>(writer.GetAccessor().GetRow(y)); | |
57 for (unsigned int x = 0; x < writer.GetAccessor().GetWidth(); x++, p++) | |
58 { | |
59 *p = v; | |
60 v += 25; | |
61 } | |
62 } | |
63 } | |
64 | |
65 OrthancStone::CoordinateSystem3D viewpoint; | |
66 | |
67 //OrthancStone::DicomVolumeImageReslicer slicer(volume); slicer.SetInterpolation(OrthancStone::ImageInterpolation_Nearest); | |
68 OrthancStone::DicomVolumeImageMPRSlicer slicer(volume); | |
69 std::unique_ptr<OrthancStone::IVolumeSlicer::IExtractedSlice> slice(slicer.ExtractSlice(viewpoint)); | |
70 ASSERT_TRUE(slice->IsValid()); | |
71 | |
72 OrthancStone::CopyStyleConfigurator configurator; | |
73 std::unique_ptr<OrthancStone::ISceneLayer> layer(slice->CreateSceneLayer(&configurator, viewpoint)); | |
74 | |
75 { | |
76 const Orthanc::ImageAccessor& a = dynamic_cast<OrthancStone::TextureBaseSceneLayer&>(*layer).GetTexture(); | |
77 Orthanc::Image i(Orthanc::PixelFormat_Grayscale8, a.GetWidth(), a.GetHeight(), false); | |
78 Orthanc::ImageProcessing::Convert(i, a); | |
79 | |
80 ASSERT_EQ(3u, i.GetWidth()); | |
81 ASSERT_EQ(3u, i.GetHeight()); | |
82 | |
83 ASSERT_FLOAT_EQ(0, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 0, 0)); | |
84 ASSERT_FLOAT_EQ(25, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 1, 0)); | |
85 ASSERT_FLOAT_EQ(50, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 2, 0)); | |
86 ASSERT_FLOAT_EQ(75, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 0, 1)); | |
87 ASSERT_FLOAT_EQ(100, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 1, 1)); | |
88 ASSERT_FLOAT_EQ(125, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 2, 1)); | |
89 ASSERT_FLOAT_EQ(150, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 0, 2)); | |
90 ASSERT_FLOAT_EQ(175, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 1, 2)); | |
91 ASSERT_FLOAT_EQ(200, Orthanc::ImageTraits<Orthanc::PixelFormat_Grayscale8>::GetFloatPixel(i, 2, 2)); | |
92 } | |
93 | |
94 OrthancStone::Scene2D scene; // Scene is initialized with the identity viewpoint | |
95 scene.SetLayer(0, layer.release()); | |
96 | |
97 OrthancStone::CairoCompositor compositor(5, 5); | |
98 compositor.Refresh(scene); | |
99 | |
100 Orthanc::ImageAccessor i; | |
101 compositor.GetCanvas().GetReadOnlyAccessor(i); | |
102 | |
103 Orthanc::Image j(Orthanc::PixelFormat_RGB24, i.GetWidth(), i.GetHeight(), false); | |
104 Orthanc::ImageProcessing::Convert(j, i); | |
105 | |
106 ASSERT_EQ(5u, j.GetWidth()); | |
107 ASSERT_EQ(5u, j.GetHeight()); | |
108 Orthanc::PixelTraits<Orthanc::PixelFormat_RGB24>::PixelType pixel; | |
109 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 0, 0); ASSERT_EQ(0, pixel.red_); | |
110 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 1, 0); ASSERT_EQ(0, pixel.red_); | |
111 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 2, 0); ASSERT_EQ(0, pixel.red_); | |
112 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 3, 0); ASSERT_EQ(0, pixel.red_); | |
113 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 4, 0); ASSERT_EQ(0, pixel.red_); | |
114 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 0, 1); ASSERT_EQ(0, pixel.red_); | |
115 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 1, 1); ASSERT_EQ(0, pixel.red_); | |
116 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 2, 1); ASSERT_EQ(0, pixel.red_); | |
117 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 3, 1); ASSERT_EQ(0, pixel.red_); | |
118 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 4, 1); ASSERT_EQ(0, pixel.red_); | |
119 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 0, 2); ASSERT_EQ(0, pixel.red_); | |
120 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 1, 2); ASSERT_EQ(0, pixel.red_); | |
121 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 2, 2); ASSERT_EQ(0, pixel.red_); | |
122 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 3, 2); ASSERT_EQ(25, pixel.red_); | |
123 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 4, 2); ASSERT_EQ(50, pixel.red_); | |
124 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 0, 3); ASSERT_EQ(0, pixel.red_); | |
125 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 1, 3); ASSERT_EQ(0, pixel.red_); | |
126 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 2, 3); ASSERT_EQ(75, pixel.red_); | |
127 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 3, 3); ASSERT_EQ(100, pixel.red_); | |
128 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 4, 3); ASSERT_EQ(125, pixel.red_); | |
129 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 0, 4); ASSERT_EQ(0, pixel.red_); | |
130 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 1, 4); ASSERT_EQ(0, pixel.red_); | |
131 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 2, 4); ASSERT_EQ(150, pixel.red_); | |
132 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 3, 4); ASSERT_EQ(175, pixel.red_); | |
133 Orthanc::ImageTraits<Orthanc::PixelFormat_RGB24>::GetPixel(pixel, j, 4, 4); ASSERT_EQ(200, pixel.red_); | |
26 } | 134 } |
27 | 135 |