comparison UnitTestsSources/VolumeRenderingTests.cpp @ 1782:f053c80ea411

ImageBuffer3D::CommitSagittalSlice()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 14 May 2021 16:30:54 +0200
parents bf4b15b059ea
children 75d3e2ab1fe1
comparison
equal deleted inserted replaced
1781:bf4b15b059ea 1782:f053c80ea411
186 186
187 187
188 // Render the scene using the identity viewpoint (default) 188 // Render the scene using the identity viewpoint (default)
189 static Orthanc::ImageAccessor* Render(OrthancStone::ISceneLayer* layer, 189 static Orthanc::ImageAccessor* Render(OrthancStone::ISceneLayer* layer,
190 unsigned int width, 190 unsigned int width,
191 unsigned int height) 191 unsigned int height,
192 bool fitScene)
192 { 193 {
193 OrthancStone::Scene2D scene; 194 OrthancStone::Scene2D scene;
194 scene.SetLayer(0, layer); 195 scene.SetLayer(0, layer);
196
197 if (fitScene)
198 {
199 scene.FitContent(width, height);
200 }
201
195 return Render(scene, width, height); 202 return Render(scene, width, height);
196 } 203 }
197 204
198 205
199 enum SlicerType 206 enum SlicerType
242 return NULL; 249 return NULL;
243 } 250 }
244 } 251 }
245 252
246 253
247 static OrthancStone::TextureBaseSceneLayer* Slice3x3x1Pattern(const OrthancStone::CoordinateSystem3D& volumeCoordinates, 254 static OrthancStone::TextureBaseSceneLayer* Slice3x3x1Pattern(OrthancStone::VolumeProjection projection,
255 const OrthancStone::CoordinateSystem3D& volumeCoordinates,
248 const OrthancStone::CoordinateSystem3D& cuttingPlane, 256 const OrthancStone::CoordinateSystem3D& cuttingPlane,
249 SlicerType type) 257 SlicerType type)
250 { 258 {
251 OrthancStone::VolumeImageGeometry geometry; 259 OrthancStone::VolumeImageGeometry geometry;
252 geometry.SetSizeInVoxels(3, 3, 1); 260
261 switch (projection)
262 {
263 case OrthancStone::VolumeProjection_Axial:
264 geometry.SetSizeInVoxels(3, 3, 1);
265 break;
266
267 case OrthancStone::VolumeProjection_Sagittal:
268 geometry.SetSizeInVoxels(1, 3, 3);
269 break;
270
271 case OrthancStone::VolumeProjection_Coronal:
272 geometry.SetSizeInVoxels(3, 1, 3);
273 break;
274
275 default:
276 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
277 }
278
253 geometry.SetAxialGeometry(volumeCoordinates); 279 geometry.SetAxialGeometry(volumeCoordinates);
254 280
255 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume(new OrthancStone::DicomVolumeImage); 281 boost::shared_ptr<OrthancStone::DicomVolumeImage> volume(new OrthancStone::DicomVolumeImage);
256 volume->Initialize(geometry, Orthanc::PixelFormat_Grayscale8, false); 282 volume->Initialize(geometry, Orthanc::PixelFormat_Grayscale8, false);
257 283
258 { 284 {
259 OrthancStone::ImageBuffer3D::SliceWriter writer(volume->GetPixelData(), OrthancStone::VolumeProjection_Axial, 0); 285 OrthancStone::ImageBuffer3D::SliceWriter writer(volume->GetPixelData(), projection, 0);
260 Assign3x3Pattern(writer.GetAccessor()); 286 Assign3x3Pattern(writer.GetAccessor());
261 } 287 }
262 288
263 OrthancStone::Vector v = volume->GetGeometry().GetVoxelDimensions(OrthancStone::VolumeProjection_Axial); 289 OrthancStone::Vector v = volume->GetGeometry().GetVoxelDimensions(OrthancStone::VolumeProjection_Axial);
264 if (!OrthancStone::LinearAlgebra::IsNear(1, v[0]) || 290 if (!OrthancStone::LinearAlgebra::IsNear(1, v[0]) ||
280 306
281 for (unsigned int mode = 0; mode < 2; mode++) 307 for (unsigned int mode = 0; mode < 2; mode++)
282 { 308 {
283 OrthancStone::CoordinateSystem3D cuttingPlane; 309 OrthancStone::CoordinateSystem3D cuttingPlane;
284 310
285 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode))); 311 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
312 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
286 313
287 ASSERT_TRUE(layer.get() != NULL); 314 ASSERT_TRUE(layer.get() != NULL);
288 ASSERT_EQ(OrthancStone::ISceneLayer::Type_FloatTexture, layer->GetType()); 315 ASSERT_EQ(OrthancStone::ISceneLayer::Type_FloatTexture, layer->GetType());
289 316
290 OrthancStone::Extent2D box; 317 OrthancStone::Extent2D box;
307 ASSERT_FLOAT_EQ(150, GetPixelValue(texture, 0, 2)); 334 ASSERT_FLOAT_EQ(150, GetPixelValue(texture, 0, 2));
308 ASSERT_FLOAT_EQ(175, GetPixelValue(texture, 1, 2)); 335 ASSERT_FLOAT_EQ(175, GetPixelValue(texture, 1, 2));
309 ASSERT_FLOAT_EQ(200, GetPixelValue(texture, 2, 2)); 336 ASSERT_FLOAT_EQ(200, GetPixelValue(texture, 2, 2));
310 } 337 }
311 338
312 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 5, 5)); 339 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 5, 5, false));
313 ASSERT_EQ(5u, rendered->GetWidth()); 340 ASSERT_EQ(5u, rendered->GetWidth());
314 ASSERT_EQ(5u, rendered->GetHeight()); 341 ASSERT_EQ(5u, rendered->GetHeight());
315 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); 342 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
316 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0)); 343 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
317 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 2, 0)); 344 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 2, 0));
352 379
353 { 380 {
354 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel)); 381 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
355 layer->SetOrigin(0, 0); 382 layer->SetOrigin(0, 0);
356 383
357 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2)); 384 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
358 ASSERT_EQ(2u, rendered->GetWidth()); 385 ASSERT_EQ(2u, rendered->GetWidth());
359 ASSERT_EQ(2u, rendered->GetHeight()); 386 ASSERT_EQ(2u, rendered->GetHeight());
360 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); 387 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
361 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0)); 388 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
362 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1)); 389 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1));
365 392
366 { 393 {
367 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel)); 394 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
368 layer->SetOrigin(-0.01, 0); 395 layer->SetOrigin(-0.01, 0);
369 396
370 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2)); 397 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
371 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); 398 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
372 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0)); 399 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
373 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 1)); 400 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 1));
374 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1)); 401 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1));
375 } 402 }
376 403
377 { 404 {
378 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel)); 405 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
379 layer->SetOrigin(-0.01, -0.01); 406 layer->SetOrigin(-0.01, -0.01);
380 407
381 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2)); 408 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
382 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 0)); 409 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 0, 0));
383 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0)); 410 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 0));
384 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1)); 411 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1));
385 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1)); 412 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1));
386 } 413 }
387 414
388 { 415 {
389 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel)); 416 std::unique_ptr<OrthancStone::ColorTextureSceneLayer> layer(new OrthancStone::ColorTextureSceneLayer(pixel));
390 layer->SetOrigin(0, -0.01); 417 layer->SetOrigin(0, -0.01);
391 418
392 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2)); 419 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 2, 2, false));
393 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0)); 420 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 0));
394 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 1, 0)); 421 ASSERT_FLOAT_EQ(255, GetPixelValue(*rendered, 1, 0));
395 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1)); 422 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 0, 1));
396 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1)); 423 ASSERT_FLOAT_EQ(0, GetPixelValue(*rendered, 1, 1));
397 } 424 }
480 ASSERT_TRUE(IsConstRegion(0.0f, *rendered, 0, 27, 36, 3)); 507 ASSERT_TRUE(IsConstRegion(0.0f, *rendered, 0, 27, 36, 3));
481 } 508 }
482 } 509 }
483 510
484 511
512
485 TEST(VolumeRendering, FlipAxial) 513 TEST(VolumeRendering, FlipAxial)
486 { 514 {
487 double x = 2; 515 double x = 2;
488 double y = 1; 516 double y = 1;
489 OrthancStone::CoordinateSystem3D axial(OrthancStone::LinearAlgebra::CreateVector(x, y, 0), 517 OrthancStone::CoordinateSystem3D axial(OrthancStone::LinearAlgebra::CreateVector(x, y, 0),
511 { 539 {
512 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), 540 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
513 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), 541 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
514 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); 542 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
515 543
516 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode))); 544 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
545 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
517 ASSERT_TRUE(AreSameImages(layer->GetTexture(), pattern)); 546 ASSERT_TRUE(AreSameImages(layer->GetTexture(), pattern));
518 547
519 OrthancStone::Extent2D extent; 548 OrthancStone::Extent2D extent;
520 layer->GetBoundingBox(extent); 549 layer->GetBoundingBox(extent);
521 ASSERT_FLOAT_EQ(x - 0.5, extent.GetX1()); 550 ASSERT_FLOAT_EQ(x - 0.5, extent.GetX1());
522 ASSERT_FLOAT_EQ(y - 0.5, extent.GetY1()); 551 ASSERT_FLOAT_EQ(y - 0.5, extent.GetY1());
523 ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2()); 552 ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2());
524 ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2()); 553 ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2());
525 554
526 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15)); 555 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
527 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 8, 3, 3)); 556 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 8, 3, 3));
528 557
529 Orthanc::ImageAccessor p; 558 Orthanc::ImageAccessor p;
530 rendered->GetRegion(p, 9, 8, 3, 3); 559 rendered->GetRegion(p, 9, 8, 3, 3);
531 ASSERT_TRUE(AreSameImages(p, pattern)); 560 ASSERT_TRUE(AreSameImages(p, pattern));
534 { 563 {
535 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), 564 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
536 OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0), 565 OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0),
537 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0)); 566 OrthancStone::LinearAlgebra::CreateVector(0, 1, 0));
538 567
539 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode))); 568 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
569 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
540 if (mode == 1) 570 if (mode == 1)
541 { 571 {
542 // Reslicer directly flips the pixels of the texture 572 // Reslicer directly flips the pixels of the texture
543 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternX)); 573 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternX));
544 } 574 }
553 ASSERT_FLOAT_EQ(-(x + 2.5), extent.GetX1()); 583 ASSERT_FLOAT_EQ(-(x + 2.5), extent.GetX1());
554 ASSERT_FLOAT_EQ(y - 0.5, extent.GetY1()); 584 ASSERT_FLOAT_EQ(y - 0.5, extent.GetY1());
555 ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2()); 585 ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2());
556 ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2()); 586 ASSERT_FLOAT_EQ(y + 2.5, extent.GetY2());
557 587
558 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15)); 588 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
559 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 8, 3, 3)); 589 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 8, 3, 3));
560 590
561 Orthanc::ImageAccessor p; 591 Orthanc::ImageAccessor p;
562 rendered->GetRegion(p, 3, 8, 3, 3); 592 rendered->GetRegion(p, 3, 8, 3, 3);
563 ASSERT_TRUE(AreSameImages(p, patternX)); 593 ASSERT_TRUE(AreSameImages(p, patternX));
566 { 596 {
567 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), 597 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
568 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0), 598 OrthancStone::LinearAlgebra::CreateVector(1, 0, 0),
569 OrthancStone::LinearAlgebra::CreateVector(0, -1, 0)); 599 OrthancStone::LinearAlgebra::CreateVector(0, -1, 0));
570 600
571 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode))); 601 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
602 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
572 if (mode == 1) 603 if (mode == 1)
573 { 604 {
574 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternY)); 605 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternY));
575 } 606 }
576 else 607 else
583 ASSERT_FLOAT_EQ(x - 0.5, extent.GetX1()); 614 ASSERT_FLOAT_EQ(x - 0.5, extent.GetX1());
584 ASSERT_FLOAT_EQ(-(y + 2.5), extent.GetY1()); 615 ASSERT_FLOAT_EQ(-(y + 2.5), extent.GetY1());
585 ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2()); 616 ASSERT_FLOAT_EQ(x + 2.5, extent.GetX2());
586 ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2()); 617 ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2());
587 618
588 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15)); 619 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
589 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 4, 3, 3)); 620 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 9, 4, 3, 3));
590 621
591 Orthanc::ImageAccessor p; 622 Orthanc::ImageAccessor p;
592 rendered->GetRegion(p, 9, 4, 3, 3); 623 rendered->GetRegion(p, 9, 4, 3, 3);
593 ASSERT_TRUE(AreSameImages(p, patternY)); 624 ASSERT_TRUE(AreSameImages(p, patternY));
596 { 627 {
597 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0), 628 OrthancStone::CoordinateSystem3D cuttingPlane(OrthancStone::LinearAlgebra::CreateVector(0, 0, 0),
598 OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0), 629 OrthancStone::LinearAlgebra::CreateVector(-1, 0, 0),
599 OrthancStone::LinearAlgebra::CreateVector(0, -1, 0)); 630 OrthancStone::LinearAlgebra::CreateVector(0, -1, 0));
600 631
601 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(Slice3x3x1Pattern(axial, cuttingPlane, static_cast<SlicerType>(mode))); 632 std::unique_ptr<OrthancStone::TextureBaseSceneLayer> layer(
633 Slice3x3x1Pattern(OrthancStone::VolumeProjection_Axial, axial, cuttingPlane, static_cast<SlicerType>(mode)));
602 if (mode == 1) 634 if (mode == 1)
603 { 635 {
604 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternXY)); 636 ASSERT_TRUE(AreSameImages(layer->GetTexture(), patternXY));
605 } 637 }
606 else 638 else
613 ASSERT_FLOAT_EQ(-(x + 2.5), extent.GetX1()); 645 ASSERT_FLOAT_EQ(-(x + 2.5), extent.GetX1());
614 ASSERT_FLOAT_EQ(-(y + 2.5), extent.GetY1()); 646 ASSERT_FLOAT_EQ(-(y + 2.5), extent.GetY1());
615 ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2()); 647 ASSERT_FLOAT_EQ(-(x - 0.5), extent.GetX2());
616 ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2()); 648 ASSERT_FLOAT_EQ(-(y - 0.5), extent.GetY2());
617 649
618 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15)); 650 std::unique_ptr<Orthanc::ImageAccessor> rendered(Render(layer.release(), 15, 15, false));
619 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 4, 3, 3)); 651 ASSERT_TRUE(IsConstImageWithExclusion(0.0f, *rendered, 3, 4, 3, 3));
620 652
621 Orthanc::ImageAccessor p; 653 Orthanc::ImageAccessor p;
622 rendered->GetRegion(p, 3, 4, 3, 3); 654 rendered->GetRegion(p, 3, 4, 3, 3);
623 ASSERT_TRUE(AreSameImages(p, patternXY)); 655 ASSERT_TRUE(AreSameImages(p, patternXY));