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();
100 HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id)
101 : wxPanel(parent,id){
103 SetBackgroundColour(wxColour(255,255,255));
107 plotter=new pPlotter(this, 400,350);
109 //is a plotter of histograms
111 //setting the popMenu
112 plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
114 idTransferenceFunction = -1;
116 transferenceFunctionHasColor = true;
117 transferenceFunctionHasPoints = true;
119 this->SetAutoLayout(true);
125 void HistogramWidget::initializeHistogram(vtkImageData* img){
128 histogram= new pHistogram(img);
132 drawTransferenceFunction();
135 HistogramWidget::~HistogramWidget()
142 Draw the histogram in the plotter
144 void HistogramWidget::drawHistogram()
146 //int xValues[MAX],yValues[MAX],extent[6];
150 vtkImageData* histogramImageData=histogram->getHistogram();
153 histogramSize=histogram->getSize();
156 xValues=(double*)malloc(NUM_POINTS*sizeof(double));
157 yValues=(double*)malloc(NUM_POINTS*sizeof(double));
159 double* histogramPointer=(double*)histogramImageData->GetScalarPointer(0,0,0);
161 for(i=0; i< histogramSize; i++)
164 if (histogramPointer[i]==0)
168 yValues[i]=log(histogramPointer[i])*10;
169 } // histogramPointer
173 pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
175 if (histogramFunction)
177 histogramFunction->setEditable(false);
179 histogramFunction->setType(2);
181 histogramFunction->setmType(2);
182 idHistogram=plotter->addFunction(histogramFunction);
183 //for setting range the vision
184 plotter->addFunctionToMove(histogramFunction);
185 wxPen mypen1(*wxBLUE, 1, wxSOLID );
187 histogramFunction->SetPen( mypen1 );
195 Draw the transference function in the plotter
198 void HistogramWidget::drawTransferenceFunction()
200 double xValues[5],yValues[5];
202 int maxValueGrey=histogram->getMaximumLevelOfGrey();
204 xValues[1] = maxValueGrey/16;
205 xValues[2] = maxValueGrey/8;
206 xValues[3] = maxValueGrey/16+(maxValueGrey-maxValueGrey/2)/2;
207 xValues[4] = maxValueGrey;
216 pGraphicalFunction * tf = plotter ->getFunctionForVectors( xValues, 5, yValues, 5 );
217 printf("EED %p HistogramWidget::drawTransferenceFunction %p\n", this , tf);
218 // Including and drawing the created function in the plotter
222 //is the actual Function
225 tf->SetShowPoints(true);
226 idTransferenceFunction=plotter->addFunction( tf );
229 plotter->addFunctionToMove(tf);
231 wxPen mypen(*wxBLACK,0.5, wxSOLID );
238 if the user resize the window
240 void HistogramWidget::OnSize(wxSizeEvent &WXUNUSED(event))
243 GetClientSize(&scrX,&scrY);
244 plotter->SetSize(scrX,scrY);
245 pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
248 actual->setScreens(scrX,scrY);
254 get number of points of the transference function
256 int HistogramWidget::getSizeTransferenceFunction()
258 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
259 return tf->getSizePoints();
263 get a point of the transference function
265 void HistogramWidget::getTransferenceFunctionPoint(int index,int& x,int& y)
267 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
270 wxNode* pnode = tf->GetPointAt(index);
271 pFunctionPoint* point = (pFunctionPoint*)pnode->GetData();
272 x = point->getRealX();
273 y = point->getRealY();
277 get a point of the Histogram
280 int HistogramWidget::getHistogramPoint(int gValue)
282 return histogram->getHistogramPoint(gValue);
285 get number of points of the barColor
287 int HistogramWidget::getSizeBarColor()
289 return plotter->getColorPointsSize();
292 get a color int the bqr color
294 void HistogramWidget::getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
297 plotter->getBarColorDataAt(index,tmp,red,green,blue);
301 Returns the maximum value ot the histogram that is show to the user
303 float HistogramWidget::getMaxShowedPorcentage()
305 float porcentageMaxX = plotter->getMaxShowedPorcentage();
306 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
307 int min = histogramFunction->getMinX();
308 float x = porcentageMaxX*(histogramFunction->getMaxX()-min);
312 Returns the minimum value ot the histogram that is show to the user
314 float HistogramWidget::getMinShowedPorcentage()
316 float porcentageMinX = plotter->getMinShowedPorcentage();
317 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
318 int min = histogramFunction->getMinX();
319 float x = porcentageMinX*(histogramFunction->getMaxX()-min);
323 Returns the minimum value ot the histogram that is show to the user
325 float HistogramWidget::getActualShowedPorcentage()
327 float porcentageActualX = plotter->getMinShowedPorcentage();
328 pGraphicalFunction* histogramFunction = plotter->getFunction(idHistogram);
329 int min = histogramFunction->getMinX();
330 float x = porcentageActualX*(histogramFunction->getMaxX()-min);
333 //---------------------------------------
334 // setting data in transferences function
336 //----------------------------------------
338 Adds a point to the transference function
340 bool HistogramWidget::addPointToTransferenceFunction(double x, double y)
343 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
344 //printf("EED %p HistogramWidget::addPointToTransferenceFunction tp%p x%f y%f %d\n",this, tf, x ,y, idTransferenceFunction);
347 result=tf->AddPoint(x,y);
353 add a color point to the histogram
354 @param x the level of grey to which the color is assigned
355 @param red the level of red for the color
356 @param green the level of red for the color
357 @param blue the level of red for the color
359 bool HistogramWidget::addColorPoint(double x,int red,int green, int blue)
361 return plotter->addColorPoint(x,red,green,blue);
364 //------------------------
366 //------------------------
368 Erase all the points that are in the transference function
371 void HistogramWidget::erasePointsTransferenceFunction(/*bool allPoints*/)
373 if(transferenceFunctionHasPoints)
375 // we have to erase the points
376 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
378 int numOfPoints=tf->getSizePoints();
379 int i=numOfPoints-1;//-2;
382 tf->deletePointAt(i);
386 } // if transferenceFunctionHasPoints
388 //we set for actual the histogram
389 //plotter->setActual()
392 Erase the color points in the plotter
394 void HistogramWidget::eraseColorPoints()
396 plotter->eraseColorPoints();
401 void HistogramWidget::updatePlotter()
406 //-------------------
407 // Getter and setters
408 //-------------------
410 void HistogramWidget::setTransferenceFunctionHasPoints(bool hasPoints)
412 transferenceFunctionHasPoints = hasPoints;
415 void HistogramWidget::setTransferenceFunctionHasColor(bool hasColorPoints)
417 transferenceFunctionHasPoints = hasColorPoints;
420 int HistogramWidget::getHistogramSize()
422 return histogramSize;
425 void HistogramWidget::setType(int type)
431 ** Returns two vectors, the grey level of the point and its value, the value is between [0,1]
433 void HistogramWidget::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value)
435 plotter->GetValuesPointsFunction(greylevel,value,histogramSize);
439 ** Returns two vectors, the grey level of the point and its value, the red, green
440 ** and blue value is between [0,1]
442 void HistogramWidget::GetValuesColorPointsFunction(std::vector<double>& greylevel,
443 std::vector<double>& red,
444 std::vector<double>& green,
445 std::vector<double>& blue)
447 plotter->GetValuesColorPointsFunction(greylevel,red,green,blue);