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 # ------------------------------------------------------------------------ */
26 #include "FillFilter.h"
27 #include "creaVtk_MACROS.h"
33 FillFilter::FillFilter()
43 //---------------------------------------------------------------------------
44 FillFilter::~FillFilter()
46 if (_auxImageFill != NULL)
48 _auxImageFill->Delete();
52 //---------------------------------------------------------------------------
53 void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
55 baseFilterManualPaint::SetImages(image,image2);
56 if ((_maxX!=_maxXback) || (_maxY!=_maxYback) || (_maxZ!=_maxZback))
58 if (_auxImageFill != NULL)
60 _auxImageFill->Delete();
62 _auxImageFill = vtkImageData::New();
63 _auxImageFill->SetDimensions(_maxX + 1, _maxY + 1, _maxZ + 1);
64 _auxImageFill->SetOrigin(0, 0, 0);
65 _auxImageFill->SetExtent(0, _maxX, 0, _maxY, 0, _maxZ);
66 //EED 2017-01-01 Migration VTK7
67 #if VTK_MAJOR_VERSION <= 5
68 _auxImageFill->SetWholeExtent(0, _maxX, 0, _maxY, 0, _maxZ);
69 _auxImageFill->SetScalarTypeToUnsignedChar();
70 _auxImageFill->AllocateScalars();
72 _auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
75 unsigned char * ptrAuxImageFill = (unsigned char *)_auxImageFill->GetScalarPointer();
76 memset(ptrAuxImageFill, 0, (_maxX+1) * (_maxY+1) * (_maxZ+1) );
85 //---------------------------------------------------------------------------
86 void FillFilter::Run() // virtual
89 if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
90 && (_pz >= _minZ) && (_pz <= _maxZ))
92 this->_IMManager->BaseInitialPoint(_px, _py ,_pz);
93 _graylevelbasefill = _image->GetScalarComponentAsDouble(_px, _py, _pz,0);
94 _distbasefill = _distancefill * _distancefill;
95 ivi = _px + _py*(_maxX+1) + _pz*(_maxX+1)*(_maxY+1); // index vector image
96 FillToolLoop(_px, _py, _pz, ivi);
97 } //if _minX _maxX _minY _maxY _minZ _maxZ
100 //---------------------------------------------------------------------------
101 void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA)
103 double difX,difY,difZ,_tmpDistfill;
104 std::vector<int> lstX;
105 std::vector<int> lstY;
106 std::vector<int> lstZ;
107 std::vector<long long int> lstivi;
111 lstivi.push_back( iviA );
113 DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)
116 DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)
119 DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)
120 while ( lstX.size()!=0 )
122 // if point inside image
123 if ((lstX[0] >= _minX) && (lstX[0] <= _maxX) && (lstY[0] >= _minY) && (lstY[0] <= _maxY) && (lstZ[0] >= _minZ) && (lstZ[0] <= _maxZ))
128 _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
129 // if distance of center point
130 if (_tmpDistfill<=_distbasefill)
132 // if point not visited
133 GETVALUE2_VTK_CREA(v_auxImageFill,p_auxImageFill,st_auxImageFill,lstivi[0] );
134 if (v_auxImageFill==0)
136 // If Gray Level valid
139 // _tmpiglfill = _image->GetScalarComponentAsDouble(px, py, pz, 0);
140 GETVALUE2_VTK_CREA(_tmpiglfill,p_image,st_image,lstivi[0])
145 // _tmpiglfill2 = _image2->GetScalarComponentAsDouble(px, py, pz, 0);
146 GETVALUE2_VTK_CREA(_tmpiglfill2,p_image2,st_image2,lstivi[0])
148 _tmpiglfill2 = _tmpiglfill;
151 float grayLBFMTOL = _graylevelbasefill - _tolerancefill;
152 float grayLBFPTOL = _graylevelbasefill + _tolerancefill;
153 bool isInRange = false;
155 if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
158 else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
159 grayLBFMTOL = _RangeMin;
162 else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
163 grayLBFPTOL = _RangeMax;
166 else if ((_RangeMin <= _graylevelbasefill) && (_graylevelbasefill <= _RangeMax)) {
167 grayLBFMTOL = _RangeMin;
168 grayLBFPTOL = _RangeMax;
174 _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
175 && (_tmpiglfill2 != _graylevel)
176 && (_tmpiglfill >= grayLBFMTOL)
177 && (_tmpiglfill <= grayLBFPTOL)
178 && (_tmpDistfill <= _distbasefill); //DFCH
180 _auxGrayLevelValidationFill = false;
183 if (_auxGrayLevelValidationFill)
186 this->_IMManager->AddModifiedPixel(lstX[0], lstY[0], lstZ[0]); //DFCH
191 // _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
192 SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,lstivi[0])
194 // _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
195 SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,lstivi[0])
198 // Add neighborhood points in the list
201 if (_direction == 0) // YZ
203 //lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneColumn);
204 //lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneColumn);
205 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneLine);
206 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneLine);
207 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
208 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
210 if (_direction == 1) // XZ
212 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneColumn);
213 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneColumn);
214 // lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneLine);
215 // lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneLine);
216 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
217 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
219 if (_direction == 2) // XY
221 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneColumn);
222 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneColumn);
223 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneLine);
224 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneLine);
225 //lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
226 //lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
229 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneColumn);
230 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneColumn);
231 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]+_OneLine);
232 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0] ); lstivi.push_back( lstivi[0]-_OneLine);
233 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
234 lstX.push_back(lstX[0] ); lstY.push_back(lstY[0] ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
236 } // if gray level valid _auxGrayLevelValidationFill
237 } // if point not visited
238 // Add point to already visited
239 SETVALUE2_VTK_CREA(1,p_auxImageFill,st_auxImageFill,lstivi[0]);
240 } // if distance of center point
241 } // if point inside image
242 // Remove point from the list
243 lstX.erase( lstX.begin() );
244 lstY.erase( lstY.begin() );
245 lstZ.erase( lstZ.begin() );
246 lstivi.erase( lstivi.begin() );
247 } // while _lstX.size
250 //---------------------------------------------------------------------------
251 void FillFilter::SetToleranceFill(double tolerancefill)
253 _tolerancefill = tolerancefill;
256 //---------------------------------------------------------------------------
257 void FillFilter::SetDistanceFill(int distancefill)
259 _distancefill = distancefill;
262 //---------------------------------------------------------------------------
263 vtkImageData* FillFilter::GetAuxImageFill()
265 return _auxImageFill;