00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __freImageMerger_txx
00023 #define __freImageMerger_txx
00024
00025 #include "freImageMerger.h"
00026 #include "freExceptions.h"
00027
00028 #include "freDifferenceToRGBImageFilter.h"
00029
00030 #include "itkConstrainedValueAdditionImageFilter.h"
00031 #include "itkWeightedAddImageFilter.h"
00032 #include "itkCheckerBoardImageFilter.h"
00033 #include "itkSquaredDifferenceImageFilter.h"
00034 #include "itkSqrtImageFilter.h"
00035
00036 namespace FREE
00037 {
00038
00039 template <class TImage>
00040 typename ImageMerger<TImage>::RGBImagePointer
00041 ImageMerger<TImage>::
00042 GenerateAlternationImage(ImageType* pInput1, ImageType* pInput2, ImageType* pInput3)
00043 {
00044 if (!pInput1) throwStaticExceptionMacro("Cannot compute alternation image: Input1 is null");
00045 if (!pInput2) throwStaticExceptionMacro("Cannot compute alternation image: Input2 is null");
00046 if (!pInput3) throwStaticExceptionMacro("Cannot compute alternation image: Input3 is null");
00047
00048 typedef FREE::DifferenceToRGBImageFilter<ImageType, ImageType, RGBImageType> DifRGBFilterType;
00049
00050 ImagePointer smpDiff1 = GenerateDifferenceImage(pInput1, pInput2);
00051 ImagePointer smpDiff2 = GenerateDifferenceImage(pInput1, pInput3);
00052
00053 typename DifRGBFilterType::Pointer difFilter = DifRGBFilterType::New();
00054
00055 difFilter->SetInput1( smpDiff1 );
00056 difFilter->SetInput2( smpDiff2 );
00057 difFilter->Update();
00058
00059 typename RGBImageType::Pointer smpResult = difFilter->GetOutput();
00060
00061 return smpResult;
00062 };
00063
00064 template <class TImage>
00065 typename ImageMerger<TImage>::RGBImagePointer
00066 ImageMerger<TImage>::
00067 GenerateAlternationImage(ImageType* pInput3) const
00068 {
00069 return GenerateAlternationImage(m_Input1, m_Input2, pInput3);
00070 };
00071
00072 template <class TImage>
00073 typename ImageMerger<TImage>::ImagePointer
00074 ImageMerger<TImage>::
00075 GenerateBlendImage(ImageType* pInput1, ImageType* pInput2, unsigned int iMergeValue)
00076 {
00077 if (!pInput1) throwStaticExceptionMacro("Cannot compute blend image: Input1 is null");
00078 if (!pInput2) throwStaticExceptionMacro("Cannot compute blend image: Input2 is null");
00079
00080 typedef itk::WeightedAddImageFilter<ImageType, ImageType, ImageType> FilterType;
00081
00082 typename FilterType::Pointer filter = FilterType::New();
00083 filter->SetInput1( pInput1 );
00084 filter->SetInput2( pInput2 );
00085 filter->SetAlpha(iMergeValue/100.0);
00086 filter->Update();
00087 ImagePointer smpResult = filter->GetOutput();
00088
00089 return smpResult;
00090 };
00091
00092 template <class TImage>
00093 typename ImageMerger<TImage>::ImagePointer
00094 ImageMerger<TImage>::
00095 GenerateBlendImage(unsigned int iMergeValue) const
00096 {
00097 return GenerateBlendImage(m_Input1, m_Input2, iMergeValue);
00098 };
00099
00100 template <class TImage>
00101 typename ImageMerger<TImage>::ImagePointer
00102 ImageMerger<TImage>::
00103 GenerateCheckerImage(ImageType* pInput1, ImageType* pInput2, unsigned int iPatternSize)
00104 {
00105 if (!pInput1) throwStaticExceptionMacro("Cannot compute checker: Input1 is null");
00106 if (!pInput2) throwStaticExceptionMacro("Cannot compute checker: Input2 is null");
00107
00108 typedef itk::CheckerBoardImageFilter<ImageType> FilterType;
00109
00110 typename FilterType::PatternArrayType pattern;
00111 pattern.Fill(iPatternSize);
00112
00113 typename FilterType::Pointer filter = FilterType::New();
00114 filter->SetInput1( pInput1 );
00115 filter->SetInput2( pInput2 );
00116 filter->SetCheckerPattern(pattern);
00117 filter->Update();
00118 ImagePointer result = filter->GetOutput();
00119 return result;
00120 };
00121
00122 template <class TImage>
00123 typename ImageMerger<TImage>::ImagePointer
00124 ImageMerger<TImage>::
00125 GenerateCheckerImage(unsigned int iPatternSize) const
00126 {
00127 return GenerateCheckerImage(m_Input1, m_Input2, iPatternSize);
00128 };
00129
00130 template <class TImage>
00131 typename ImageMerger<TImage>::ImagePointer
00132 ImageMerger<TImage>::
00133 GenerateDifferenceImage(ImageType* pInput1, ImageType* pInput2)
00134 {
00135 if (!pInput1) throwStaticExceptionMacro("Cannot compute difference Input1 is null");
00136 if (!pInput2) throwStaticExceptionMacro("Cannot compute difference Input2 is null");
00137
00138 typedef itk::SquaredDifferenceImageFilter<ImageType, ImageType, ImageType> DifFilterType;
00139 typedef itk::SqrtImageFilter<ImageType, ImageType> SqrtFilterType;
00140
00141 typename DifFilterType::Pointer difFilter = DifFilterType::New();
00142 typename SqrtFilterType::Pointer sqrtFilter = SqrtFilterType::New();
00143
00144 difFilter->SetInput1( pInput1 );
00145 difFilter->SetInput2( pInput2 );
00146 sqrtFilter->SetInput(difFilter->GetOutput());
00147 sqrtFilter->Update();
00148 return sqrtFilter->GetOutput();
00149 };
00150
00151 template <class TImage>
00152 typename ImageMerger<TImage>::ImagePointer
00153 ImageMerger<TImage>::
00154 GenerateDifferenceImage() const
00155 {
00156 return GenerateDifferenceImage(m_Input1, m_Input2);
00157 };
00158
00159 template <class TImage>
00160 typename ImageMerger<TImage>::RGBImagePointer
00161 ImageMerger<TImage>::
00162 GenerateColoredDifferenceImage(ImageType* pInput1, ImageType* pInput2)
00163 {
00164 if (!pInput1) throwStaticExceptionMacro("Cannot compute colored difference Input1 is null");
00165 if (!pInput2) throwStaticExceptionMacro("Cannot compute colored difference Input2 is null");
00166
00167 typedef FREE::DifferenceToRGBImageFilter<ImageType, ImageType, RGBImageType> DifRGBFilterType;
00168
00169 typename DifRGBFilterType::Pointer difFilter = DifRGBFilterType::New();
00170
00171 difFilter->SetInput1( pInput1 );
00172 difFilter->SetInput2( pInput2 );
00173 difFilter->Update();
00174
00175 RGBImagePointer smpResult = difFilter->GetOutput();
00176 return smpResult;
00177 };
00178
00179 template <class TImage>
00180 typename ImageMerger<TImage>::RGBImagePointer
00181 ImageMerger<TImage>::
00182 GenerateColoredDifferenceImage() const
00183 {
00184 return GenerateColoredDifferenceImage(m_Input1, m_Input2);
00185 };
00186
00187 template <class TImage>
00188 ImageMerger<TImage>::
00189 ImageMerger(ImageType* pInput1, ImageType* pInput2)
00190 {
00191 m_Input1 = pInput1;
00192 m_Input2 = pInput2;
00193 };
00194
00195 template <class TImage>
00196 ImageMerger<TImage>::
00197 ~ImageMerger() {};
00198
00199 }
00200
00201 #endif