diff --git a/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.cpp b/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.cpp index 4dddb63fb2..4571563a30 100644 --- a/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.cpp +++ b/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.cpp @@ -1,190 +1,190 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // mitk includes #include "mitkMultiComponentImageDataComparisonFilter.h" #include "mitkImageReadAccessor.h" #include "mitkImagePixelReadAccessor.h" // other includes // #include namespace mitk { MultiComponentImageDataComparisonFilter::MultiComponentImageDataComparisonFilter(): ImageToImageFilter(), m_Tolerance(0.0f), m_CompareResult(false), m_CompareDetails(NULL) { this->SetNumberOfRequiredInputs(2); } MultiComponentImageDataComparisonFilter::~MultiComponentImageDataComparisonFilter() { } bool MultiComponentImageDataComparisonFilter::GetResult(double threshold) { if ( !m_CompareResult ) { return false; } if( m_CompareDetails->m_PixelsWithDifference > threshold ) { return false; } return true; } void MultiComponentImageDataComparisonFilter::SetValidImage( const Image *_arg ) { this->SetInput(0, _arg); } void MultiComponentImageDataComparisonFilter::SetTestImage( const Image *_arg ) { this->SetInput(1, _arg); } const Image* MultiComponentImageDataComparisonFilter::GetValidImage() { return this->GetInput(0); } const Image* MultiComponentImageDataComparisonFilter::GetTestImage() { return this->GetInput(1); } void MultiComponentImageDataComparisonFilter::SetCompareFilterResult( CompareFilterResults* results ) { m_CompareDetails = results; } CompareFilterResults* MultiComponentImageDataComparisonFilter::GetCompareFilterResult() { return m_CompareDetails; } void MultiComponentImageDataComparisonFilter::GenerateData() { // check inputs const Image* testInput = this->GetTestImage(); const Image* validInput = this->GetValidImage(); // Generally this filter is part of the mitk::Image::Equal() method and only checks the equality of the image data // so no further image type comparison is performed! // CAVE: If the images differ in a parameter other then the image data, the filter may fail!! PixelType type = validInput->GetPixelType(); if(type.GetComponentType() == itk::ImageIOBase::CHAR) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::UCHAR) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::INT) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::UINT) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::SHORT) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::USHORT) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::LONG) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::ULONG) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::FLOAT) { CompareMultiComponentImage( testInput, validInput); } else if (type.GetComponentType() == itk::ImageIOBase::DOUBLE) { CompareMultiComponentImage( testInput, validInput); } else { mitkThrow() << "Pixel component type not supported!"; } } template void mitk::MultiComponentImageDataComparisonFilter::CompareMultiComponentImage( const Image* testImage, const Image* validImage ) { unsigned int noOfTimes = validImage->GetDimension(3); unsigned int noOfPixels = validImage->GetDimension(0)*validImage->GetDimension(1)*validImage->GetDimension(2); unsigned int noOfComponents = validImage->GetPixelType().GetNumberOfComponents(); - for( int t = 0; t < noOfTimes; ++t) + for( unsigned int t = 0; t < noOfTimes; ++t) { ImageReadAccessor readAccTImage(const_cast(testImage), const_cast(testImage)->GetVolumeData(t)); ImageReadAccessor readAccVImage(const_cast(validImage), const_cast(validImage)->GetVolumeData(t)); - for( int p = 0; p < noOfPixels*noOfComponents; ++p ) + for( unsigned int p = 0; p < noOfPixels*noOfComponents; ++p ) { TPixel vDataItem = static_cast(const_cast(readAccVImage.GetData()))[p]; TPixel tDataItem = static_cast(const_cast(readAccTImage.GetData()))[p]; if( tDataItem != vDataItem ) { ++m_CompareDetails->m_PixelsWithDifference; m_CompareDetails->m_MaximumDifference = std::max(m_CompareDetails->m_MaximumDifference, std::abs( static_cast(tDataItem - vDataItem) ) ); double min = std::min(m_CompareDetails->m_MinimumDifference, std::abs( static_cast(tDataItem - vDataItem) )); if(min != 0.0f) // a difference of zero is not a difference! m_CompareDetails->m_MinimumDifference = min; m_CompareDetails->m_TotalDifference += std::abs(static_cast(tDataItem - vDataItem) ); } } } if(m_CompareDetails->m_PixelsWithDifference != 0) { m_CompareDetails->m_MeanDifference = m_CompareDetails->m_TotalDifference / m_CompareDetails->m_PixelsWithDifference; m_CompareResult = false; } else { m_CompareResult = true; } } } // end namespace mitk \ No newline at end of file diff --git a/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.h b/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.h index 2dae0159fd..69a4929302 100644 --- a/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.h +++ b/Core/Code/Algorithms/mitkMultiComponentImageDataComparisonFilter.h @@ -1,92 +1,92 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef MITKMULTICOMPONENTIMAGEDATACOMPARISONFILTER_H #define MITKMULTICOMPONENTIMAGEDATACOMPARISONFILTER_H // mitk includes #include "mitkImageToImageFilter.h" #include "mitkCompareImageDataFilter.h" //struct CompareFilterResults; namespace mitk { /*! Documentation: * \brief Filter for comparing two multi channel mitk::Image objects by channel wise by pixel values * * The comparison is channel- / pixel-wise. */ class MITK_CORE_EXPORT MultiComponentImageDataComparisonFilter : public ImageToImageFilter { public: mitkClassMacro(MultiComponentImageDataComparisonFilter, ImageToImageFilter); itkSimpleNewMacro(Self); /*! /brief */ void SetTestImage( const Image *_arg); const Image* GetTestImage(); /*! /brief */ void SetValidImage( const Image *_arg); const Image* GetValidImage(); /*! /brief Specify the tolerance of the image data comparison /param Tolerance Default is 0.0f. */ itkSetMacro(Tolerance, double); itkGetMacro(Tolerance, double); /*! /brief */ void SetCompareFilterResult( CompareFilterResults* results); /*! /brief Get the detailed results of the comparison run * /sa CompareFilterResults */ CompareFilterResults* GetCompareFilterResult(); /*! /brief Get the result of the comparison * The method compares only the number of pixels with differences. It returns true if the amount * is under the specified threshold. To get the complete results, use the GetCompareResults method. * Returns false also if the itk ComparisionImageFilter raises an exception during update. * /param threshold Allowed percentage of pixels with differences (between 0.0...1.0) */ bool GetResult( double threshold = 0.0f); protected: MultiComponentImageDataComparisonFilter(); ~MultiComponentImageDataComparisonFilter(); virtual void GenerateData(); template < typename TPixel > void CompareMultiComponentImage( const Image* testImage, const Image* validImage); - bool m_CompareResult; double m_Tolerance; + bool m_CompareResult; CompareFilterResults* m_CompareDetails; }; } // end namespace mitk #endif // MITKMULTICOMPONENTIMAGEDATACOMPARISONFILTER_H diff --git a/Core/Code/Testing/mitkMultiComponentImageDataComparisonFilterTest.cpp b/Core/Code/Testing/mitkMultiComponentImageDataComparisonFilterTest.cpp index e2225f5a45..7d93451d09 100644 --- a/Core/Code/Testing/mitkMultiComponentImageDataComparisonFilterTest.cpp +++ b/Core/Code/Testing/mitkMultiComponentImageDataComparisonFilterTest.cpp @@ -1,79 +1,80 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // mitk includes #include "mitkTestingMacros.h" #include "mitkMultiComponentImageDataComparisonFilter.h" #include "mitkItkImageFileReader.h" #include "itkNumericTraits.h" int mitkMultiComponentImageDataComparisonFilterTest(int argc, char* argv[]) { MITK_TEST_BEGIN("MultiComponentImageDataComparisonFilter"); // instantiation mitk::MultiComponentImageDataComparisonFilter::Pointer testObject = mitk::MultiComponentImageDataComparisonFilter::New(); MITK_TEST_CONDITION_REQUIRED(testObject.IsNotNull(), "Testing instantiation of test class!"); MITK_TEST_CONDITION_REQUIRED(testObject->GetCompareFilterResult() == NULL, "Testing initialization of result struct" ); MITK_TEST_CONDITION_REQUIRED(testObject->GetTolerance() == 0.0f, "Testing initialization of tolerance member"); MITK_TEST_CONDITION_REQUIRED(testObject->GetResult() == false, "Testing initialization of CompareResult member"); // initialize compare result struct and pass it to the filter mitk::CompareFilterResults compareResult; compareResult.m_MaximumDifference = 0.0f; compareResult.m_MinimumDifference = itk::NumericTraits::max(); compareResult.m_MeanDifference = 0.0f; compareResult.m_FilterCompleted = false; compareResult.m_TotalDifference = 0.0f; compareResult.m_PixelsWithDifference = 0; testObject->SetCompareFilterResult(&compareResult); MITK_TEST_CONDITION_REQUIRED(testObject->GetCompareFilterResult() != NULL, "Testing set/get of compare result struct" ); MITK_TEST_CONDITION_REQUIRED(testObject->GetResult() == false, "CompareResult still false" ); //now load an image with several components and present it to the filter mitk::ItkImageFileReader::Pointer imgReader = mitk::ItkImageFileReader::New(); imgReader->SetFileName(argv[1]); imgReader->Update(); mitk::Image::Pointer testImg = imgReader->GetOutput(); mitk::Image::Pointer testImg2 = testImg->Clone(); testObject->SetValidImage(testImg); testObject->SetTestImage(testImg2); MITK_TEST_CONDITION_REQUIRED(testObject->GetNumberOfIndexedInputs() == 2, "Testing correct handling of input images"); testObject->Update(); MITK_TEST_CONDITION_REQUIRED(testObject->GetResult(), "Testing filter processing with equal image data"); // now change some of the data and check if the response is correct - unsigned char* imgData = (unsigned char*) testImg2->GetData(); + mitk::ImageReadAccessor imgAcc(testImg2); + unsigned char* imgData = (unsigned char*) imgAcc.GetData(); imgData[10] += 1; imgData[20] += 2; imgData[30] += 3; testObject->Update(); MITK_TEST_CONDITION_REQUIRED(testObject->GetResult() == false, "Testing filter processing with unequal image data"); MITK_TEST_CONDITION_REQUIRED(mitk::Equal((int)testObject->GetCompareFilterResult()->m_PixelsWithDifference, (int) 3) && mitk::Equal((double)testObject->GetCompareFilterResult()->m_MaximumDifference, (double) 3.0) && mitk::Equal((double)testObject->GetCompareFilterResult()->m_MeanDifference, (double) 2.0), "Assessing calculated image differences"); MITK_TEST_END(); }