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){
131 if(histogram ==NULL){
132 histogram= new pHistogram(img);
136 drawTransferenceFunction();
139 HistogramWidget::~HistogramWidget()
146 Draw the histogram in the plotter
148 void HistogramWidget::drawHistogram()
150 //int xValues[MAX],yValues[MAX],extent[6];
154 vtkImageData* histogramImageData=histogram->getHistogram();
157 histogramSize=histogram->getSize();
160 xValues=(double*)malloc(NUM_POINTS*sizeof(double));
161 yValues=(double*)malloc(NUM_POINTS*sizeof(double));
163 unsigned short* histogramPointer=(unsigned short*)histogramImageData->GetScalarPointer(0,0,0);
165 for(int i=0; i< histogramSize; i++)
168 yValues[i]=log( (double) histogramPointer[i]);
172 pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
174 if (histogramFunction)
176 histogramFunction->setEditable(false);
178 histogramFunction->setType(2);
180 histogramFunction->setmType(2);
181 idHistogram=plotter->addFunction(histogramFunction);
182 //for setting range the vision
183 plotter->addFunctionToMove(histogramFunction);
184 wxPen mypen1(*wxBLUE, 1, wxSOLID );
186 histogramFunction->SetPen( mypen1 );
194 Draw the transference function in the plotter
197 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 );
228 plotter->addFunctionToMove(tf);
229 wxPen mypen(*wxBLACK,0.5, wxSOLID );
236 if the user resize the window
238 void HistogramWidget::OnSize(wxSizeEvent &WXUNUSED(event))
241 GetClientSize(&scrX,&scrY);
242 plotter->SetSize(scrX,scrY);
243 pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
245 actual->setScreens(scrX,scrY);
251 get number of points of the transference function
253 int HistogramWidget::getSizeTransferenceFunction()
255 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
256 return tf->getSizePoints();
260 get a point of the transference function
262 void HistogramWidget::getTransferenceFunctionPoint(int index,int& x,int& y)
264 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
267 wxNode* pnode=tf->GetPointAt(index);
268 pFunctionPoint* point=(pFunctionPoint*)pnode->GetData();
274 get a point of the Histogram
277 int HistogramWidget::getHistogramPoint(int gValue)
279 return histogram->getHistogramPoint(gValue);
282 get number of points of the barColor
284 int HistogramWidget::getSizeBarColor()
286 return plotter->getColorPointsSize();
289 get a color int the bqr color
291 void HistogramWidget:: getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
294 plotter->getBarColorDataAt(index,tmp,red,green,blue);
298 Returns the maximum value ot the histogram that is show to the user
300 float HistogramWidget::getMaxShowedPorcentage()
302 float porcentageMaxX=plotter->getMaxShowedPorcentage();
303 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
304 int min=histogramFunction->getMinX();
305 float x=porcentageMaxX*(histogramFunction->getMaxX()-min);
309 Returns the minimum value ot the histogram that is show to the user
311 float HistogramWidget::getMinShowedPorcentage()
313 float porcentageMinX=plotter->getMinShowedPorcentage();
314 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
315 int min=histogramFunction->getMinX();
316 float x=porcentageMinX*(histogramFunction->getMaxX()-min);
320 Returns the minimum value ot the histogram that is show to the user
322 float HistogramWidget::getActualShowedPorcentage()
324 float porcentageActualX=plotter->getMinShowedPorcentage();
325 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
326 int min=histogramFunction->getMinX();
327 float x=porcentageActualX*(histogramFunction->getMaxX()-min);
330 //---------------------------------------
331 // setting data in transferences function
333 //----------------------------------------
335 Adds a point to the transference function
337 bool HistogramWidget::addPointToTransferenceFunction(double x, double y)
340 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
341 //printf("EED %p HistogramWidget::addPointToTransferenceFunction tp%p x%f y%f %d\n",this, tf, x ,y, idTransferenceFunction);
342 if (tf!=NULL) { result=tf->AddPoint(x,y); }
347 add a color point to the histogram
348 @param x the level of grey to which the color is assigned
349 @param red the level of red for the color
350 @param green the level of red for the color
351 @param blue the level of red for the color
353 bool HistogramWidget::addColorPoint(double x,int red,int green, int blue)
355 return plotter->addColorPoint(x,red,green,blue);
358 //------------------------
360 //------------------------
362 Erase all the points that are in the transference function
365 void HistogramWidget::erasePointsTransferenceFunction(/*bool allPoints*/)
367 if(transferenceFunctionHasPoints)
369 // we have to erase the points
370 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
372 int numOfPoints=tf->getSizePoints();
373 int i=numOfPoints-1;//-2;
376 tf->deletePointAt(i);
380 } // if transferenceFunctionHasPoints
382 //we set for actual the histogram
383 //plotter->setActual()
386 Erase the color points in the plotter
388 void HistogramWidget::eraseColorPoints()
390 plotter->eraseColorPoints();
395 void HistogramWidget::updatePlotter()
400 //-------------------
401 // Getter and setters
402 //-------------------
404 void HistogramWidget::setTransferenceFunctionHasPoints(bool hasPoints)
406 transferenceFunctionHasPoints=hasPoints;
409 void HistogramWidget::setTransferenceFunctionHasColor(bool hasColorPoints)
411 transferenceFunctionHasPoints=hasColorPoints;
413 int HistogramWidget::getHistogramSize()
415 return histogramSize;
417 void HistogramWidget::setType(int type)
423 ** Returns two vectors, the grey level of the point and its value, the value is between [0,1]
425 void HistogramWidget::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value){
426 plotter->GetValuesPointsFunction(greylevel,value,histogramSize);
430 ** Returns two vectors, the grey level of the point and its value, the red, green
431 ** and blue value is between [0,1]
433 void HistogramWidget::GetValuesColorPointsFunction(std::vector<double>& greylevel,
434 std::vector<double>& red,
435 std::vector<double>& green,
436 std::vector<double>& blue)
438 plotter->GetValuesColorPointsFunction(greylevel,red,green,blue);