1 /*# ---------------------------------------------------------------------
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 # This software is governed by the CeCILL-B license under French law and
10 # abiding by the rules of distribution of free software. You can use,
11 # modify and/ or redistribute the software under the terms of the CeCILL-B
12 # license as circulated by CEA, CNRS and INRIA at the following URL
13 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 # or in the file LICENSE.txt.
16 # As a counterpart to the access to the source code and rights to copy,
17 # modify and redistribute granted by the license, users are provided only
18 # with a limited warranty and the software's author, the holder of the
19 # economic rights, and the successive licensors have only limited
22 # The fact that you are presently reading this means that you have had
23 # knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
27 This class plots image's histograms in a plotter
30 //---------------------
32 //----------------------
33 #include "HistogramWidget.h"
34 #include "vtkImageCast.h"
37 // ----------------------------------------------------------------------------
38 // WX headers inclusion.
39 // For compilers that support precompilation, includes <wx/wx.h>.
40 // ----------------------------------------------------------------------------
46 #include <wx/bitmap.h>
47 //----------------------------------------------------------------------------
48 // Class implementation
49 //----------------------------------------------------------------------------
51 IMPLEMENT_CLASS(HistogramWidget, wxWindow)
52 //----------------------------------------------------------------------------
54 //----------------------------------------------------------------------------
56 BEGIN_EVENT_TABLE(HistogramWidget, wxWindow)
57 EVT_SIZE (HistogramWidget::OnSize)
59 //---------------------
61 //----------------------
62 //wxScrolledWindow(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxHSCROLL | wxVSCROLL, const wxString& name = "scrolledWindow")
63 //wxWindow(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxPanelNameStr)
64 //pPlotterWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
66 HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag):wxWindow(parent,id,pos,size,flag)
70 HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData,int type):
71 wxPanel(parent,id,wxDefaultPosition,wxDefaultSize)
73 SetBackgroundColour(wxColour(255,255,255));
75 histogram= new pHistogram(imageData);
79 plotter=new pPlotter(this, 400,350);
81 //is a plotter of histograms
84 plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
86 idTransferenceFunction=-1;
88 transferenceFunctionHasColor=true;
89 transferenceFunctionHasPoints=true;
92 this->SetAutoLayout(true);
97 drawTransferenceFunction();
101 HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id)
102 : wxPanel(parent,id){
105 SetBackgroundColour(wxColour(255,255,255));
110 plotter=new pPlotter(this, 400,350);
112 //is a plotter of histograms
114 //setting the popMenu
115 plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
117 idTransferenceFunction=-1;
119 transferenceFunctionHasColor=true;
120 transferenceFunctionHasPoints=true;
122 this->SetAutoLayout(true);
130 void HistogramWidget::initializeHistogram(vtkImageData* img){
133 histogram= new pHistogram(img);
137 drawTransferenceFunction();
140 HistogramWidget::~HistogramWidget()
147 Draw the histogram in the plotter
149 void HistogramWidget::drawHistogram()
151 //int xValues[MAX],yValues[MAX],extent[6];
155 vtkImageData* histogramImageData=histogram->getHistogram();
158 histogramSize=histogram->getSize();
161 xValues=(double*)malloc(NUM_POINTS*sizeof(double));
162 yValues=(double*)malloc(NUM_POINTS*sizeof(double));
164 double* histogramPointer=(double*)histogramImageData->GetScalarPointer(0,0,0);
166 for(i=0; i< histogramSize; i++)
169 if (histogramPointer[i]==0)
173 yValues[i]=log(histogramPointer[i])*10;
174 } // histogramPointer
178 pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
180 if (histogramFunction)
182 histogramFunction->setEditable(false);
184 histogramFunction->setType(2);
186 histogramFunction->setmType(2);
187 idHistogram=plotter->addFunction(histogramFunction);
188 //for setting range the vision
189 plotter->addFunctionToMove(histogramFunction);
190 wxPen mypen1(*wxBLUE, 1, wxSOLID );
192 histogramFunction->SetPen( mypen1 );
200 Draw the transference function in the plotter
203 void HistogramWidget::drawTransferenceFunction()
205 double xValues[5],yValues[5];
207 int maxValueGrey=histogram->getMaximumLevelOfGrey();
209 xValues[1]=maxValueGrey/16;
210 xValues[2]=maxValueGrey/8;
211 xValues[3]=maxValueGrey/16+(maxValueGrey-maxValueGrey/2)/2;
212 xValues[4]=maxValueGrey;
221 pGraphicalFunction * tf = plotter ->getFunctionForVectors( xValues, 5, yValues, 5 );
222 printf("EED %p HistogramWidget::drawTransferenceFunction %p\n", this , tf);
223 // Including and drawing the created function in the plotter
227 //is the actual Function
230 tf->SetShowPoints(true);
231 idTransferenceFunction=plotter->addFunction( tf );
234 plotter->addFunctionToMove(tf);
236 wxPen mypen(*wxBLACK,0.5, wxSOLID );
243 if the user resize the window
245 void HistogramWidget::OnSize(wxSizeEvent &WXUNUSED(event))
248 GetClientSize(&scrX,&scrY);
249 plotter->SetSize(scrX,scrY);
250 pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
253 actual->setScreens(scrX,scrY);
259 get number of points of the transference function
261 int HistogramWidget::getSizeTransferenceFunction()
263 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
264 return tf->getSizePoints();
268 get a point of the transference function
270 void HistogramWidget::getTransferenceFunctionPoint(int index,int& x,int& y)
272 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
275 wxNode* pnode = tf->GetPointAt(index);
276 pFunctionPoint* point = (pFunctionPoint*)pnode->GetData();
277 x = point->getRealX();
278 y = point->getRealY();
282 get a point of the Histogram
285 int HistogramWidget::getHistogramPoint(int gValue)
287 return histogram->getHistogramPoint(gValue);
290 get number of points of the barColor
292 int HistogramWidget::getSizeBarColor()
294 return plotter->getColorPointsSize();
297 get a color int the bqr color
299 void HistogramWidget::getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
302 plotter->getBarColorDataAt(index,tmp,red,green,blue);
306 Returns the maximum value ot the histogram that is show to the user
308 float HistogramWidget::getMaxShowedPorcentage()
310 float porcentageMaxX = plotter->getMaxShowedPorcentage();
311 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
312 int min = histogramFunction->getMinX();
313 float x = porcentageMaxX*(histogramFunction->getMaxX()-min);
317 Returns the minimum value ot the histogram that is show to the user
319 float HistogramWidget::getMinShowedPorcentage()
321 float porcentageMinX = plotter->getMinShowedPorcentage();
322 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
323 int min = histogramFunction->getMinX();
324 float x = porcentageMinX*(histogramFunction->getMaxX()-min);
328 Returns the minimum value ot the histogram that is show to the user
330 float HistogramWidget::getActualShowedPorcentage()
332 float porcentageActualX = plotter->getMinShowedPorcentage();
333 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
334 int min = histogramFunction->getMinX();
335 float x = porcentageActualX*(histogramFunction->getMaxX()-min);
338 //---------------------------------------
339 // setting data in transferences function
341 //----------------------------------------
343 Adds a point to the transference function
345 bool HistogramWidget::addPointToTransferenceFunction(double x, double y)
348 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
349 //printf("EED %p HistogramWidget::addPointToTransferenceFunction tp%p x%f y%f %d\n",this, tf, x ,y, idTransferenceFunction);
352 result=tf->AddPoint(x,y);
358 add a color point to the histogram
359 @param x the level of grey to which the color is assigned
360 @param red the level of red for the color
361 @param green the level of red for the color
362 @param blue the level of red for the color
364 bool HistogramWidget::addColorPoint(double x,int red,int green, int blue)
366 return plotter->addColorPoint(x,red,green,blue);
369 //------------------------
371 //------------------------
373 Erase all the points that are in the transference function
376 void HistogramWidget::erasePointsTransferenceFunction(/*bool allPoints*/)
378 if(transferenceFunctionHasPoints)
380 // we have to erase the points
381 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
383 int numOfPoints=tf->getSizePoints();
384 int i=numOfPoints-1;//-2;
387 tf->deletePointAt(i);
391 } // if transferenceFunctionHasPoints
393 //we set for actual the histogram
394 //plotter->setActual()
397 Erase the color points in the plotter
399 void HistogramWidget::eraseColorPoints()
401 plotter->eraseColorPoints();
406 void HistogramWidget::updatePlotter()
411 //-------------------
412 // Getter and setters
413 //-------------------
415 void HistogramWidget::setTransferenceFunctionHasPoints(bool hasPoints)
417 transferenceFunctionHasPoints = hasPoints;
420 void HistogramWidget::setTransferenceFunctionHasColor(bool hasColorPoints)
422 transferenceFunctionHasPoints = hasColorPoints;
425 int HistogramWidget::getHistogramSize()
427 return histogramSize;
430 void HistogramWidget::setType(int type)
436 ** Returns two vectors, the grey level of the point and its value, the value is between [0,1]
438 void HistogramWidget::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value)
440 plotter->GetValuesPointsFunction(greylevel,value,histogramSize);
444 ** Returns two vectors, the grey level of the point and its value, the red, green
445 ** and blue value is between [0,1]
447 void HistogramWidget::GetValuesColorPointsFunction(std::vector<double>& greylevel,
448 std::vector<double>& red,
449 std::vector<double>& green,
450 std::vector<double>& blue)
452 plotter->GetValuesColorPointsFunction(greylevel,red,green,blue);