DGtalTools  0.9.2
sliceViewer.cpp
1 
28 #include <iostream>
30 #ifndef Q_MOC_RUN
31 #include "DGtal/base/Common.h"
32 #include "DGtal/base/BasicFunctors.h"
33 #include "DGtal/helpers/StdDefs.h"
34 #include "DGtal/io/readers/GenericReader.h"
35 #include "DGtal/io/Color.h"
36 #include "DGtal/io/DrawWithDisplay3DModifier.h"
37 #endif
38 #ifdef WITH_ITK
39 #include "DGtal/io/readers/DicomReader.h"
40 #endif
41 
42 #include "sliceViewer.h"
43 #include "ui_sliceViewer.h"
44 
45 
46 #ifndef Q_MOC_RUN
47 #include "DGtal/io/viewers/Viewer3D.h"
48 #include "DGtal/io/viewers/DrawWithViewer3DModifier.h"
49 #include "DGtal/io/readers/PointListReader.h"
50 #include "DGtal/images/ConstImageAdapter.h"
51 #include <boost/program_options/options_description.hpp>
52 #include <boost/program_options/parsers.hpp>
53 #include <boost/program_options/variables_map.hpp>
54 #endif
55 
56 using namespace std;
57 using namespace DGtal;
58 using namespace Z3i;
59 
61 namespace po = boost::program_options;
62 
63 
64 
100 // Set to define slider int value and grid size
101 
102 static const int MIN_ZOOM_FACTOR = 10.0;
103 static const int MAX_ZOOM_FACTOR = 40.0;
104 static const int INIT_SCALE1_ZOOM_FACTOR = 20.0;
105 
106 
107 
108 template <typename TImage>
109 static QImage
110 getImage(const TImage &anImage, double gridSize, const MainWindow::ColorMapFunctor &colFunctor ){
111  typedef ConstImageAdapter<TImage, typename TImage::Domain,
112  functors::BasicDomainSubSampler<typename TImage::Domain, int, double>,
113  unsigned int,
114  MainWindow::ColorMapFunctor> ConstImageAdapterForSubSampling;
115 
116  std::vector<double> scales;
117  scales.push_back(gridSize);
118  scales.push_back(gridSize);
119  functors::BasicDomainSubSampler<typename TImage::Domain, int, double> subSampler (anImage.domain(),
120  scales, Z2i::Point(0,0));
121  typename TImage::Domain newDomain = subSampler.getSubSampledDomain();
122  ConstImageAdapterForSubSampling scaledImage (anImage, newDomain, subSampler, colFunctor );
123  unsigned int height = scaledImage.domain().upperBound()[1]-scaledImage.domain().lowerBound()[1];
124  unsigned int width = scaledImage.domain().upperBound()[0]-scaledImage.domain().lowerBound()[0];
125  QImage res (width, height,QImage::Format_RGB32 );
126  for(unsigned int i=0; i<height; i++){
127  for(unsigned int j=0; j<width; j++){
128  res.setPixel(j, height-i-1, scaledImage(Z2i::Point(j,i)+scaledImage.domain().lowerBound()));
129  }
130  }
131  return res;
132 }
133 
134 
135 MainWindow::MainWindow(DGtal::Viewer3D<> *aViewer,
136  DGtal::ImageContainerBySTLVector < DGtal::Z3i::Domain, unsigned char > *anImage,
137  const ColorMapFunctor &aFunctor, QWidget *parent, Qt::WindowFlags flags) :
138  QMainWindow(parent),
139  ui(new Ui::MainWindow),
140  myViewer(aViewer),
141  myImage3D(anImage),
142  myColorMap(aFunctor)
143 {
144 
145  ui->setupUi(this);
146  ui->verticalLayout_5->addWidget(aViewer);
147 
148 
149  ui->_horizontalSliderZ->setMinimum(anImage->domain().lowerBound()[2]);
150  ui->_horizontalSliderZ->setMaximum(anImage->domain().upperBound()[2]);
151  ui->_horizontalSliderZ->setValue(anImage->domain().lowerBound()[2]);
152 
153  ui->_horizontalSliderY->setMinimum(anImage->domain().lowerBound()[1]);
154  ui->_horizontalSliderY->setMaximum(anImage->domain().upperBound()[1]);
155  ui->_horizontalSliderY->setValue(anImage->domain().lowerBound()[1]);
156 
157  ui->_horizontalSliderX->setMinimum(anImage->domain().lowerBound()[0]);
158  ui->_horizontalSliderX->setMaximum(anImage->domain().upperBound()[0]);
159  ui->_horizontalSliderX->setValue(anImage->domain().lowerBound()[0]);
160 
161  ui->_zoomXSlider->setMinimum( MIN_ZOOM_FACTOR);
162  ui->_zoomXSlider->setMaximum( MAX_ZOOM_FACTOR);
163  ui->_zoomXSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
164 
165  ui->_zoomYSlider->setMinimum(MIN_ZOOM_FACTOR);
166  ui->_zoomYSlider->setMaximum(MAX_ZOOM_FACTOR);
167  ui->_zoomYSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
168 
169  ui->_zoomZSlider->setMinimum(MIN_ZOOM_FACTOR);
170  ui->_zoomZSlider->setMaximum(MAX_ZOOM_FACTOR);
171  ui->_zoomZSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
172 
173  QObject::connect(ui->_horizontalSliderX, SIGNAL(valueChanged(int)), this, SLOT(updateSliceImageX()));
174  QObject::connect(ui->_horizontalSliderY, SIGNAL(valueChanged(int)), this, SLOT(updateSliceImageY()));
175  QObject::connect(ui->_horizontalSliderZ, SIGNAL(valueChanged(int)), this, SLOT(updateSliceImageZ()));
176  QObject::connect(ui->_zoomXSlider, SIGNAL(valueChanged(int)), this, SLOT(updateZoomImageX()));
177  QObject::connect(ui->_zoomYSlider, SIGNAL(valueChanged(int)), this, SLOT(updateZoomImageY()));
178  QObject::connect(ui->_zoomZSlider, SIGNAL(valueChanged(int)), this, SLOT(updateZoomImageZ()));
179 
180  QObject::connect(ui->_scale1ButtonX, SIGNAL(clicked()), this, SLOT(setScale1_1_ImageX()));
181  QObject::connect(ui->_scale1ButtonY, SIGNAL(clicked()), this, SLOT(setScale1_1_ImageY()));
182  QObject::connect(ui->_scale1ButtonZ, SIGNAL(clicked()), this, SLOT(setScale1_1_ImageZ()));
183 
184  QObject::connect(ui->_CoolButton, SIGNAL(clicked()), this, SLOT(changeCoolColorMap()));
185  QObject::connect(ui->_HotButton, SIGNAL(clicked()), this, SLOT(changeHotColorMap()));
186  QObject::connect(ui->_HueButton, SIGNAL(clicked()), this, SLOT(changeHueColorMap()));
187  QObject::connect(ui->_NormalButton, SIGNAL(clicked()), this, SLOT(changeNormalColorMap()));
188 
189 
190 }
191 
193 {
194  delete ui;
195 }
196 
201 }
205 }
206 
210 }
214 }
218 }
219 
220 
221 void MainWindow::setImageProjX(const QPixmap &aPixMap){
222  ui->ImageProjX->setPixmap(aPixMap);
223 }
224 void MainWindow::setImageProjY(const QPixmap &aPixMap){
225  ui->ImageProjY->setPixmap(aPixMap);
226 }
227 void MainWindow::setImageProjZ(const QPixmap &aPixMap){
228  ui->ImageProjZ->setPixmap(aPixMap);
229 }
230 
231 
233  updateSliceImageX(ui->_horizontalSliderX->value(), false);
234 }
235 
237  updateSliceImageY(ui->_horizontalSliderY->value(), false);
238 }
239 
241  updateSliceImageZ(ui->_horizontalSliderZ->value(), false);
242 }
243 
244 
246  ui->_zoomXSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
248 }
249 
251  ui->_zoomYSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
253 }
254 
256  ui->_zoomZSlider->setValue(INIT_SCALE1_ZOOM_FACTOR);
258 }
259 
260 
261 
263  double gridSize = (double)INIT_SCALE1_ZOOM_FACTOR/ui->_zoomXSlider->value();
264  updateZoomImageX(ui->_horizontalSliderX->value(), gridSize );
265  QString gridStr = QString::number(gridSize, 'f', 3);
266  QString scaleStr = QString::number(1.0/gridSize, 'f', 3);
267  ui->_groupBoxX->setTitle(QString("Slice View X: sampling grid size: ").append(gridStr).
268  append(QString(" (zoom x "). append(scaleStr).append(QString(")") )));
269 }
271  double gridSize = (double)INIT_SCALE1_ZOOM_FACTOR/ui->_zoomYSlider->value();
272  updateZoomImageY(ui->_horizontalSliderY->value(), gridSize );
273  QString gridStr = QString::number(gridSize, 'f', 3);
274  QString scaleStr = QString::number(1.0/gridSize, 'f', 3);
275  ui->_groupBoxY->setTitle(QString("Slice View Y: sampling grid size: ").append(gridStr).
276  append(QString(" (zoom x "). append(scaleStr).append(QString(")") )));
277 
278 }
280  double gridSize = (double)INIT_SCALE1_ZOOM_FACTOR/ui->_zoomZSlider->value();
281  updateZoomImageZ(ui->_horizontalSliderZ->value(), gridSize );
282  QString gridStr = QString::number(gridSize, 'f', 3);
283  QString scaleStr = QString::number(1.0/gridSize, 'f', 3);
284  ui->_groupBoxZ->setTitle(QString("Slice View Z: sampling grid size: ").append(gridStr).
285  append(QString(" (zoom x "). append(scaleStr).append(QString(")") )));
286 
287 }
288 
289 
290 void MainWindow::updateZoomImageX(int sliceNumber, double gridSize){
291  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(0);
292  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
293  invFunctor(myImage3D->domain().upperBound()));
294  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(0);
295  const functors::Identity identityFunctor{};
296  SliceImageAdapter sliceImage( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
297  QImage anImage = getImage(sliceImage, gridSize, myColorMap);
298  setImageProjX(QPixmap::fromImage(anImage));
299 }
300 
301 void MainWindow::updateZoomImageY(int sliceNumber, double gridSize){
302  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(1);
303  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
304  invFunctor(myImage3D->domain().upperBound()));
305  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(1);
306  const functors::Identity identityFunctor{};
307  SliceImageAdapter sliceImage( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
308 
309  QImage anImage = getImage(sliceImage, gridSize, myColorMap);
310  setImageProjY(QPixmap::fromImage(anImage));
311 }
312 
313 
314 void MainWindow::updateZoomImageZ(int sliceNumber, double gridSize){
315  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(2);
316  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
317  invFunctor(myImage3D->domain().upperBound()));
318  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(2);
319  const functors::Identity identityFunctor{};
320  SliceImageAdapter sliceImage( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
321  QImage anImage = getImage(sliceImage, gridSize, myColorMap );
322  setImageProjZ(QPixmap::fromImage(anImage));
323 }
324 
325 
326 void MainWindow::updateSliceImageX(int sliceNumber, bool init){
327  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(0);
328  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
329  invFunctor(myImage3D->domain().upperBound()));
330  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(0);
331  const functors::Identity identityFunctor{};
332  SliceImageAdapter sliceImage ( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
333 
334  double gridSize = ((double)INIT_SCALE1_ZOOM_FACTOR)/ui->_zoomXSlider->value();
335  QImage anImage = getImage(sliceImage, gridSize,myColorMap);
336  setImageProjX(QPixmap::fromImage(anImage));
337  Z3i::Point imageOrigin = myImage3D->domain().lowerBound();
338  if(init){
339  (*myViewer) << DGtal::AddTextureImage2DWithFunctor<SliceImageAdapter, ColorMapFunctor, Z3i::Space, Z3i::KSpace>(sliceImage, myColorMap, DGtal::Viewer3D<Z3i::Space, Z3i::KSpace>::RGBMode);
340  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(0, DGtal::Viewer3D<>::xDirection, sliceNumber,
341  imageOrigin[1], imageOrigin[2]);
342  (*myViewer) << Viewer3D<>::updateDisplay;
343  }else{
344  (*myViewer) << DGtal::UpdateImageData< SliceImageAdapter, ColorMapFunctor > (0, sliceImage, 0, 0, 0 ,0, DGtal::Viewer3D<>::xDirection, myColorMap);
345  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(0, DGtal::Viewer3D<>::xDirection, sliceNumber, imageOrigin[1],
346  imageOrigin[2]);
347 
348  (*myViewer).updateList(init);
349  (*myViewer).update();
350  }
351 
352 
353 }
354 
355 
356 void MainWindow::updateSliceImageY( int sliceNumber, bool init){
357 
358  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(1);
359  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
360  invFunctor(myImage3D->domain().upperBound()));
361  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(1);
362  const functors::Identity identityFunctor{};
363  SliceImageAdapter sliceImage( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
364 
365  double gridSize = ((double)INIT_SCALE1_ZOOM_FACTOR)/ui->_zoomYSlider->value();
366  QImage anImage = getImage(sliceImage, gridSize, myColorMap);
367  setImageProjY(QPixmap::fromImage(anImage));
368  Z3i::Point imageOrigin = myImage3D->domain().lowerBound();
369  if(init){
370  (*myViewer) << DGtal::AddTextureImage2DWithFunctor<SliceImageAdapter, ColorMapFunctor, Z3i::Space, Z3i::KSpace>(sliceImage, myColorMap, DGtal::Viewer3D<Z3i::Space, Z3i::KSpace>::RGBMode);
371  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(1, DGtal::Viewer3D<>::yDirection, imageOrigin[0],
372  sliceNumber, imageOrigin[2]);
373  (*myViewer) << Viewer3D<>::updateDisplay;
374  }else{
375  (*myViewer) << DGtal::UpdateImageData< SliceImageAdapter, ColorMapFunctor > (1, sliceImage, 0,0, 0, 0, DGtal::Viewer3D<>::yDirection, myColorMap);
376  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(1, DGtal::Viewer3D<>::yDirection, imageOrigin[0],
377  sliceNumber, imageOrigin[2]);
378  (*myViewer).updateList(init);
379  (*myViewer).update();
380  }
381 
382 }
383 
384 
385 void MainWindow::updateSliceImageZ(int sliceNumber, bool init){
386 
387  DGtal::functors::Projector<DGtal::Z2i::Space> invFunctor; invFunctor.initRemoveOneDim(2);
388  DGtal::Z2i::Domain domain2D(invFunctor(myImage3D->domain().lowerBound()),
389  invFunctor(myImage3D->domain().upperBound()));
390  DGtal::functors::Projector<DGtal::Z3i::Space> aSliceFunctor(sliceNumber); aSliceFunctor.initAddOneDim(2);
391  const functors::Identity identityFunctor{};
392  SliceImageAdapter sliceImage( *myImage3D, domain2D, aSliceFunctor, identityFunctor );
393  double gridSize = (double)INIT_SCALE1_ZOOM_FACTOR/ui->_zoomZSlider->value();
394  QImage anImage = getImage(sliceImage, gridSize, myColorMap);
395  setImageProjZ(QPixmap::fromImage(anImage));
396  Z3i::Point imageOrigin = myImage3D->domain().lowerBound();
397  if(init){
398  (*myViewer) << DGtal::AddTextureImage2DWithFunctor<SliceImageAdapter, ColorMapFunctor, Z3i::Space, Z3i::KSpace>(sliceImage, myColorMap, DGtal::Viewer3D<Z3i::Space, Z3i::KSpace>::RGBMode);
399  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(2, DGtal::Viewer3D<>::zDirection, imageOrigin[0],
400  imageOrigin[1], sliceNumber);
401 
402  (*myViewer) << Viewer3D<>::updateDisplay;
403  }else{
404  (*myViewer) << DGtal::UpdateImageData< SliceImageAdapter,ColorMapFunctor > (2, sliceImage, 0,0, 0, 0, DGtal::Viewer3D<>::zDirection,
405  myColorMap);
406  (*myViewer) << DGtal::UpdateImagePosition< Space, KSpace >(2, DGtal::Viewer3D<>::zDirection, imageOrigin[0],
407  imageOrigin[1], sliceNumber);
408  (*myViewer).updateList(init);
409  (*myViewer).update();
410  }
411 
412 
413 }
414 
415 
416 
417 int main( int argc, char** argv )
418 {
419 
420  po::options_description general_opt("Allowed options are: ");
421  general_opt.add_options()
422  ("help,h", "display this message")
423  ("input,i", po::value<std::string>(), "vol file (.vol) , pgm3d (.p3d or .pgm3d, pgm (with 3 dims)) file or sdp (sequence of discrete points)" )
424  ("hueColorMap", "use hue color map to display images." )
425  ("gradHotColorMap", "use hot gradient color map to display images." )
426  ("gradCoolColorMap", "use cool gradient color map to display images." )
427 
428 #ifdef WITH_ITK
429  ("dicomMin", po::value<int>()->default_value(-1000), "set minimum density threshold on Hounsfield scale")
430  ("dicomMax", po::value<int>()->default_value(3000), "set maximum density threshold on Hounsfield scale")
431 #endif
432  ;
433 
434  bool parseOK=true;
435  po::variables_map vm;
436  try{
437  po::store(po::parse_command_line(argc, argv, general_opt), vm);
438  }catch(const std::exception& ex){
439  parseOK=false;
440  trace.info()<< "Error checking program options: "<< ex.what()<< endl;
441  }
442  po::notify(vm);
443  if( !parseOK || vm.count("help")||argc<=1)
444  {
445  std::cout << "Usage: " << argv[0] << " [input]\n"
446  << "Displays volume file with slice image by using QT and QGLviewer"<< endl
447  << general_opt << "\n";
448  return 0;
449  }
450 
451  if(! vm.count("input"))
452  {
453  trace.error() << " The file name was defined" << endl;
454  return 0;
455  }
456  string inputFilename = vm["input"].as<std::string>();
457 
458 
459  typedef ImageContainerBySTLVector < Z3i::Domain, unsigned char > Image3D;
460  typedef ImageContainerBySTLVector < Z2i::Domain, unsigned char > Image2D;
461 
462  string extension = inputFilename.substr(inputFilename.find_last_of(".") + 1);
463  if(extension!="vol" && extension != "p3d" && extension != "pgm3D" && extension != "pgm3d" && extension != "sdp" && extension != "pgm"
464 #ifdef WITH_ITK
465  && extension !="dcm"
466 #endif
467  ){
468  trace.info() << "File extension not recognized: "<< extension << std::endl;
469  return 0;
470  }
471 
472  if(extension=="vol" || extension=="pgm3d" || extension=="pgm3D"
473 #ifdef WITH_ITK
474  || extension =="dcm"
475 #endif
476  ){
477 
478 #ifdef WITH_ITK
479  int dicomMin = vm["dicomMin"].as<int>();
480  int dicomMax = vm["dicomMax"].as<int>();
481  typedef functors::Rescaling<int ,unsigned char > RescalFCT;
482  Image3D image = extension == "dcm" ? DicomReader< Image3D, RescalFCT >::importDicom( inputFilename,
483  RescalFCT(dicomMin,
484  dicomMax,
485  0, 255) ) :
486  GenericReader<Image3D>::import( inputFilename );
487  trace.info() << "Imported ITK..."<< std::endl;
488 #else
489  Image3D image = GenericReader<Image3D>::import (inputFilename );
490  trace.info() << "Imported..."<< std::endl;
491 #endif
492 
493 
494 
495  QApplication application(argc,argv);
496  Viewer3D<> *viewer = new Viewer3D<>();
497  bool usehm = vm.count("hueColorMap");
498  bool usegh = vm.count("gradHotColorMap");
499  bool usegc = vm.count("gradCoolColorMap");
500 
504  MainWindow::Id), 0,0);
505  w.setWindowTitle ( QString("sliceViewer"));
506  w.updateSliceImageX( image.domain().lowerBound()[0], true);
507  w.updateSliceImageY( image.domain().lowerBound()[1], true);
508  w.updateSliceImageZ( image.domain().lowerBound()[2], true);
509  w.show();
510  Z3i::Point size = image.domain().upperBound() - image.domain().lowerBound();
511  Z3i::Point center = image.domain().lowerBound()+size/2;
512  unsigned int maxDist = std::max(std::max(size[2], size[1]), size[2]);
513  viewer->camera()->setPosition(qglviewer::Vec(center[0],center[1],
514  center[2] + 2.0*maxDist));
515  viewer->camera()->setSceneCenter(qglviewer::Vec(center[0],center[1],center[2]));
516  application.exec();
517  delete viewer;
518  }
519 }
520 
521 
Ui::MainWindow * ui
Definition: sliceViewer.h:142
void setScale1_1_ImageY()
void changeNormalColorMap()
MainWindow(DGtal::Viewer3D<> *viewer, DGtal::ImageContainerBySTLVector< DGtal::Z3i::Domain, unsigned char > *myImage3D, const ColorMapFunctor &aFunctor, QWidget *parent=0, Qt::WindowFlags flags=0)
void updateZoomImageX()
Definition: sliceViewer.h:43
void updateSliceImageZ(int sliceNumber, bool init)
void updateSliceImageX(int sliceNumber, bool init)
STL namespace.
DGtal::ConstImageAdapter< Image3D, Image2D::Domain, DGtal::functors::Projector< DGtal::Z3i::Space >, Image3D::Value, DGtal::functors::Identity > SliceImageAdapter
Definition: sliceViewer.h:98
DGtal::ImageContainerBySTLVector< DGtal::Z2i::Domain, unsigned char > Image2D
Definition: sliceViewer.h:96
void changeCoolColorMap()
void updateZoomImageY()
ColorMapFunctor myColorMap
Definition: sliceViewer.h:145
Image3D * myImage3D
Definition: sliceViewer.h:144
void setScale1_1_ImageZ()
void updateSliceImageY(int sliceNumber, bool init)
void updateSliceImageX()
void setImageProjY(const QPixmap &aPixMap)
void updateSliceImageZ()
void setImageProjZ(const QPixmap &aPixMap)
void changeHotColorMap()
void updateAllDisplayedImages()
void setScale1_1_ImageX()
void updateZoomImageZ()
void changeHueColorMap()
void updateSliceImageY()
DGtal::ImageContainerBySTLVector< DGtal::Z3i::Domain, unsigned char > Image3D
Definition: sliceViewer.h:95
void setImageProjX(const QPixmap &aPixMap)