PageRenderTime 52ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/Modules/Filtering/ImageStatistics/test/itkImageToHistogramFilterTest.cxx

https://github.com/crtc/ITK-PBNRR-GITHUB
C++ | 402 lines | 268 code | 107 blank | 27 comment | 45 complexity | c58815e85c81ff3e510dbf1e79a73ace MD5 | raw file
  1. /*=========================================================================
  2. *
  3. * Copyright Insight Software Consortium
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0.txt
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. *=========================================================================*/
  18. #if defined(_MSC_VER)
  19. #pragma warning ( disable : 4786 )
  20. #endif
  21. #include "itkImageToHistogramFilter.h"
  22. #include "itkImage.h"
  23. #include "itkRGBPixel.h"
  24. #include "itkImageRegionIteratorWithIndex.h"
  25. #include "itkSimpleFilterWatcher.h"
  26. int itkImageToHistogramFilterTest( int , char * [] )
  27. {
  28. typedef unsigned char PixelComponentType;
  29. typedef itk::RGBPixel< PixelComponentType > RGBPixelType;
  30. const unsigned int Dimension = 3;
  31. typedef itk::Image< RGBPixelType, Dimension > RGBImageType;
  32. const unsigned int MeasurementVectorSize = 3; // RGB
  33. RGBImageType::Pointer image = RGBImageType::New();
  34. RGBImageType::RegionType region;
  35. RGBImageType::SizeType size;
  36. RGBImageType::IndexType start;
  37. size[0] = 127;
  38. size[1] = 127;
  39. size[2] = 127;
  40. start[0] = 0;
  41. start[1] = 0;
  42. start[2] = 0;
  43. region.SetIndex( start );
  44. region.SetSize( size );
  45. image->SetRegions( region );
  46. image->Allocate();
  47. // Now fill up the image will all the combinations of RGB
  48. // values from 0-255 on each channel.
  49. itk::ImageRegionIteratorWithIndex< RGBImageType > it( image, region );
  50. it.GoToBegin();
  51. RGBPixelType pixel;
  52. RGBImageType::IndexType index;
  53. while( !it.IsAtEnd() )
  54. {
  55. index = it.GetIndex();
  56. pixel.SetRed( index[0] );
  57. pixel.SetGreen( index[1] );
  58. pixel.SetBlue( index[2] );
  59. it.Set( pixel );
  60. ++it;
  61. }
  62. typedef itk::Statistics::ImageToHistogramFilter< RGBImageType > HistogramFilterType;
  63. typedef HistogramFilterType::HistogramMeasurementVectorType HistogramMeasurementVectorType;
  64. typedef HistogramFilterType::InputHistogramMeasurementVectorObjectType InputHistogramMeasurementVectorObjectType;
  65. typedef HistogramFilterType::InputBooleanObjectType InputBooleanObjectType;
  66. typedef HistogramFilterType::HistogramSizeType HistogramSizeType;
  67. typedef HistogramFilterType::HistogramType HistogramType;
  68. HistogramFilterType::Pointer filter = HistogramFilterType::New();
  69. itk::SimpleFilterWatcher watcher(filter, "filter");
  70. // Exercise the method NameOfClass();
  71. std::cout << filter->GetNameOfClass() << std::endl;
  72. // Testing the settings of the BinMaximum and BinMinimum methods.
  73. HistogramMeasurementVectorType histogramBinMinimum1( MeasurementVectorSize );
  74. histogramBinMinimum1[0] = 0;
  75. histogramBinMinimum1[1] = 0;
  76. histogramBinMinimum1[2] = 0;
  77. HistogramMeasurementVectorType histogramBinMinimum2( MeasurementVectorSize );
  78. histogramBinMinimum2[0] = 17;
  79. histogramBinMinimum2[1] = 17;
  80. histogramBinMinimum2[2] = 17;
  81. filter->SetHistogramBinMinimum( histogramBinMinimum1 );
  82. const InputHistogramMeasurementVectorObjectType * returnedHistogramBinMinimumObject =
  83. filter->GetHistogramBinMinimumInput();
  84. if( returnedHistogramBinMinimumObject == NULL )
  85. {
  86. std::cerr << "SetHistogramSize() failed pointer consistency test" << std::endl;
  87. return EXIT_FAILURE;
  88. }
  89. HistogramMeasurementVectorType returnedHistogramBinMinimum =
  90. returnedHistogramBinMinimumObject->Get();
  91. for( unsigned int k1 = 0; k1 < MeasurementVectorSize; k1++ )
  92. {
  93. if( returnedHistogramBinMinimum[k1] != histogramBinMinimum1[k1] )
  94. {
  95. std::cerr << "Get/Set HistogramBinMinimum() failed value consistency test" << std::endl;
  96. return EXIT_FAILURE;
  97. }
  98. }
  99. filter->SetHistogramBinMinimum( histogramBinMinimum2 );
  100. // exercise the Get method which hides the decorator
  101. returnedHistogramBinMinimum = filter->GetHistogramBinMinimum();
  102. for( unsigned int k2 = 0; k2 < MeasurementVectorSize; k2++ )
  103. {
  104. if( returnedHistogramBinMinimum[k2] != histogramBinMinimum2[k2] )
  105. {
  106. std::cerr << "Get/Set HistogramSize() failed value consistency test" << std::endl;
  107. return EXIT_FAILURE;
  108. }
  109. }
  110. InputHistogramMeasurementVectorObjectType::Pointer histogramBinMinimumObject = InputHistogramMeasurementVectorObjectType::New();
  111. histogramBinMinimumObject->Set( histogramBinMinimum1 );
  112. filter->SetHistogramBinMinimumInput( histogramBinMinimumObject );
  113. returnedHistogramBinMinimumObject = filter->GetHistogramBinMinimumInput();
  114. if( returnedHistogramBinMinimumObject != histogramBinMinimumObject )
  115. {
  116. std::cerr << "Get/Set HistogramBinMinimum() failed pointer consistency test" << std::endl;
  117. return EXIT_FAILURE;
  118. }
  119. returnedHistogramBinMinimum = returnedHistogramBinMinimumObject->Get();
  120. for( unsigned int k3 = 0; k3 < MeasurementVectorSize; k3++ )
  121. {
  122. if( returnedHistogramBinMinimum[k3] != histogramBinMinimum1[k3] )
  123. {
  124. std::cerr << "Get/Set HistogramBinMinimum() failed value consistency test" << std::endl;
  125. return EXIT_FAILURE;
  126. }
  127. }
  128. histogramBinMinimumObject->Set( histogramBinMinimum2 );
  129. filter->SetInput3( histogramBinMinimumObject );
  130. returnedHistogramBinMinimumObject = filter->GetInput3();
  131. if( returnedHistogramBinMinimumObject != histogramBinMinimumObject )
  132. {
  133. std::cerr << "Get/Set HistogramBinMinimum() failed pointer consistency test" << std::endl;
  134. return EXIT_FAILURE;
  135. }
  136. returnedHistogramBinMinimum = returnedHistogramBinMinimumObject->Get();
  137. for( unsigned int k4 = 0; k4 < MeasurementVectorSize; k4++ )
  138. {
  139. if( returnedHistogramBinMinimum[k4] != histogramBinMinimum2[k4] )
  140. {
  141. std::cerr << "Get/Set HistogramBinMinimum() failed value consistency test" << std::endl;
  142. return EXIT_FAILURE;
  143. }
  144. }
  145. filter->SetHistogramBinMinimum( histogramBinMinimum1 );
  146. HistogramMeasurementVectorType histogramBinMaximum1( MeasurementVectorSize );
  147. histogramBinMaximum1[0] = 0;
  148. histogramBinMaximum1[1] = 0;
  149. histogramBinMaximum1[2] = 0;
  150. HistogramMeasurementVectorType histogramBinMaximum2( MeasurementVectorSize );
  151. histogramBinMaximum2[0] = 17;
  152. histogramBinMaximum2[1] = 17;
  153. histogramBinMaximum2[2] = 17;
  154. filter->SetHistogramBinMaximum( histogramBinMaximum1 );
  155. const InputHistogramMeasurementVectorObjectType * returnedHistogramBinMaximumObject =
  156. filter->GetHistogramBinMaximumInput();
  157. if( returnedHistogramBinMaximumObject == NULL )
  158. {
  159. std::cerr << "SetHistogramSize() failed pointer consistency test" << std::endl;
  160. return EXIT_FAILURE;
  161. }
  162. HistogramMeasurementVectorType returnedHistogramBinMaximum = returnedHistogramBinMaximumObject->Get();
  163. for( unsigned int k1 = 0; k1 < MeasurementVectorSize; k1++ )
  164. {
  165. if( returnedHistogramBinMaximum[k1] != histogramBinMaximum1[k1] )
  166. {
  167. std::cerr << "Get/Set HistogramBinMaximum() failed value consistency test" << std::endl;
  168. return EXIT_FAILURE;
  169. }
  170. }
  171. filter->SetHistogramBinMaximum( histogramBinMaximum2 );
  172. returnedHistogramBinMaximumObject = filter->GetHistogramBinMaximumInput();
  173. returnedHistogramBinMaximum = returnedHistogramBinMaximumObject->Get();
  174. for( unsigned int k2 = 0; k2 < MeasurementVectorSize; k2++ )
  175. {
  176. if( returnedHistogramBinMaximum[k2] != histogramBinMaximum2[k2] )
  177. {
  178. std::cerr << "Get/Set HistogramSize() failed value consistency test" << std::endl;
  179. return EXIT_FAILURE;
  180. }
  181. }
  182. InputHistogramMeasurementVectorObjectType::Pointer histogramBinMaximumObject = InputHistogramMeasurementVectorObjectType::New();
  183. histogramBinMaximumObject->Set( histogramBinMaximum1 );
  184. filter->SetHistogramBinMaximumInput( histogramBinMaximumObject );
  185. returnedHistogramBinMaximumObject = filter->GetHistogramBinMaximumInput();
  186. if( returnedHistogramBinMaximumObject != histogramBinMaximumObject )
  187. {
  188. std::cerr << "Get/Set HistogramBinMaximum() failed pointer consistency test" << std::endl;
  189. return EXIT_FAILURE;
  190. }
  191. returnedHistogramBinMaximum = returnedHistogramBinMaximumObject->Get();
  192. for( unsigned int k3 = 0; k3 < MeasurementVectorSize; k3++ )
  193. {
  194. if( returnedHistogramBinMaximum[k3] != histogramBinMaximum1[k3] )
  195. {
  196. std::cerr << "Get/Set HistogramBinMaximum() failed value consistency test" << std::endl;
  197. return EXIT_FAILURE;
  198. }
  199. }
  200. histogramBinMaximumObject->Set( histogramBinMaximum2 );
  201. filter->SetInput3( histogramBinMaximumObject );
  202. returnedHistogramBinMaximumObject = filter->GetInput3();
  203. if( returnedHistogramBinMaximumObject != histogramBinMaximumObject )
  204. {
  205. std::cerr << "Get/Set HistogramBinMaximum() failed pointer consistency test" << std::endl;
  206. return EXIT_FAILURE;
  207. }
  208. returnedHistogramBinMaximum = returnedHistogramBinMaximumObject->Get();
  209. for( unsigned int k4 = 0; k4 < MeasurementVectorSize; k4++ )
  210. {
  211. if( returnedHistogramBinMaximum[k4] != histogramBinMaximum2[k4] )
  212. {
  213. std::cerr << "Get/Set HistogramBinMaximum() failed value consistency test" << std::endl;
  214. return EXIT_FAILURE;
  215. }
  216. }
  217. filter->SetInput( image );
  218. filter->SetHistogramBinMaximum( histogramBinMaximum1 );
  219. unsigned long modifiedTime = filter->GetMTime();
  220. filter->SetHistogramBinMaximum( histogramBinMaximum1 );
  221. if( filter->GetMTime() != modifiedTime )
  222. {
  223. std::cerr << "SetHistogramBinMaximum() failed modified Test 1" << std::endl;
  224. return EXIT_FAILURE;
  225. }
  226. filter->SetHistogramBinMaximum( histogramBinMaximum2 );
  227. if( filter->GetMTime() == modifiedTime )
  228. {
  229. std::cerr << "SetHistogramBinMaximum() failed modified Test 2" << std::endl;
  230. return EXIT_FAILURE;
  231. }
  232. HistogramSizeType hsize( MeasurementVectorSize );
  233. hsize[0] = 127; // number of bins for the Red channel
  234. hsize[1] = 1; // number of bins for the Green channel
  235. hsize[2] = 1; // number of bins for the Blue channel
  236. // Compute the tails of the histrogram automatically
  237. InputBooleanObjectType::Pointer autoMinMaxInputObject = InputBooleanObjectType::New();
  238. autoMinMaxInputObject->Set( true );
  239. filter->SetAutoMinimumMaximumInput(autoMinMaxInputObject);
  240. filter->SetHistogramSize( hsize );
  241. filter->SetMarginalScale( 10.0 );
  242. filter->Update();
  243. const HistogramType * histogram = filter->GetOutput();
  244. const unsigned int histogramSize = histogram->Size();
  245. std::cout << "Histogram size " << histogramSize << std::endl;
  246. unsigned int channel = 0; // red channel
  247. std::cout << "Histogram of the red component" << std::endl;
  248. // We exepct to have 127 bins, each with a frequency of 127x127 = 16129.
  249. const unsigned int expectedFrequency = 127 * 127;
  250. for( unsigned int bin=0; bin < histogramSize; bin++ )
  251. {
  252. if( histogram->GetFrequency( bin, channel ) != expectedFrequency )
  253. {
  254. std::cerr << "Error in bin= " << bin << " channel = " << channel << std::endl;
  255. std::cerr << "Frequency was= " << histogram->GetFrequency( bin, channel ) << " Instead of the expected " << expectedFrequency << std::endl;
  256. return EXIT_FAILURE;
  257. }
  258. }
  259. // Now compute the histogram for the Green component
  260. hsize[0] = 1; // number of bins for the Red channel
  261. hsize[1] = 127; // number of bins for the Green channel
  262. hsize[2] = 1; // number of bins for the Blue channel
  263. filter->SetHistogramSize( hsize );
  264. filter->SetMarginalScale( 10.0 );
  265. filter->Update();
  266. channel = 1; // green channel
  267. std::cout << "Histogram of the green component" << std::endl;
  268. for( unsigned int bin=0; bin < histogramSize; bin++ )
  269. {
  270. std::cout << "bin = " << bin << " frequency = ";
  271. std::cout << histogram->GetFrequency( bin, channel ) << std::endl;
  272. }
  273. // Now compute the histogram for the Blue component
  274. hsize[0] = 1; // number of bins for the Red channel
  275. hsize[1] = 1; // number of bins for the Green channel
  276. hsize[2] = 127; // number of bins for the Blue channel
  277. filter->SetHistogramSize( hsize );
  278. filter->SetMarginalScale( 10.0 );
  279. filter->Update();
  280. channel = 2; // blue channel
  281. std::cout << "Histogram of the blue component" << std::endl;
  282. for( unsigned int bin=0; bin < histogramSize; bin++ )
  283. {
  284. std::cout << "bin = " << bin << " frequency = ";
  285. std::cout << histogram->GetFrequency( bin, channel ) << std::endl;
  286. }
  287. // Now compute the joint histogram for the three components
  288. hsize[0] = 127; // number of bins for the Red channel
  289. hsize[1] = 127; // number of bins for the Green channel
  290. hsize[2] = 127; // number of bins for the Blue channel
  291. filter->SetHistogramSize( hsize );
  292. filter->SetMarginalScale( 10.0 );
  293. filter->Update();
  294. return EXIT_SUCCESS;
  295. }