From: eduardo.davila@creatis.insa-lyon.fr Date: Fri, 12 Dec 2025 13:50:22 +0000 (+0100) Subject: #3542 bbitk NormalizedCorrelationImageToImageMetric X-Git-Url: http://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=92225295d940b0a430d5d0804adbc53ad1125c8e;p=bbtk.git #3542 bbitk NormalizedCorrelationImageToImageMetric --- diff --git a/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.cxx b/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.cxx new file mode 100644 index 0000000..f23846f --- /dev/null +++ b/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.cxx @@ -0,0 +1,10 @@ +//===== +// Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) +//===== +#include "bbitkNormalizedCorrelationImageToImageMetric.h" +#include "bbitkPackage.h" +namespace bbitk +{ + BBTK_ADD_BLACK_BOX_TO_PACKAGE(itk,NormalizedCorrelationImageToImageMetric) + BBTK_BLACK_BOX_IMPLEMENTATION(NormalizedCorrelationImageToImageMetric,bbtk::AtomicBlackBox); +}// EO namespace bbitk diff --git a/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.h b/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.h new file mode 100644 index 0000000..c4d30bc --- /dev/null +++ b/packages/itk/src/bbitkNormalizedCorrelationImageToImageMetric.h @@ -0,0 +1,136 @@ +//===== +// Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) +//===== +#ifndef __bbitkNormalizedCorrelationImageToImageMetric_h_INCLUDED__ +#define __bbitkNormalizedCorrelationImageToImageMetric_h_INCLUDED__ + +#include "bbitk_EXPORT.h" +#include "bbtkAtomicBlackBox.h" +#include "iostream" +#include "bbitkImage.h" +#include "itkFFTNormalizedCorrelationImageFilter.h" + +#include "itkRescaleIntensityImageFilter.h" +#include "itkMinimumMaximumImageCalculator.h" + + +#include +#include + + +namespace bbitk +{ + +class bbitk_EXPORT NormalizedCorrelationImageToImageMetric + : + public bbtk::AtomicBlackBox +{ + BBTK_BLACK_BOX_INTERFACE(NormalizedCorrelationImageToImageMetric,bbtk::AtomicBlackBox); +//===== +// Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) +//===== + BBTK_DECLARE_INPUT(In1,anyImagePointer); + BBTK_DECLARE_INPUT(In2,anyImagePointer); + BBTK_DECLARE_OUTPUT(Out,double); + BBTK_PROCESS(ProcessSwitch); + private : + inline void ProcessSwitch(); + template void Process(); + + //===== +// Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) +//===== +}; + +BBTK_BEGIN_DESCRIBE_BLACK_BOX(NormalizedCorrelationImageToImageMetric,bbtk::AtomicBlackBox); + BBTK_NAME("NormalizedCorrelationImageToImageMetric"); + BBTK_AUTHOR("InfoDev"); + BBTK_DESCRIPTION("No Description."); + BBTK_CATEGORY("empty"); + BBTK_INPUT(NormalizedCorrelationImageToImageMetric,In1,"First input",anyImagePointer,""); + BBTK_INPUT(NormalizedCorrelationImageToImageMetric,In2,"Second input",anyImagePointer,""); + BBTK_OUTPUT(NormalizedCorrelationImageToImageMetric,Out,"First output",double,""); +BBTK_END_DESCRIBE_BLACK_BOX(NormalizedCorrelationImageToImageMetric); +//===== +// Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost) +//===== + + //=================================================== + void NormalizedCorrelationImageToImageMetric::ProcessSwitch() + { + bbtk::TypeInfo t = bbGetInputIn1().type(); +// BBTK_TEMPLATE_ITK_IMAGE_SWITCH(t, this->Process); + BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(t, this->Process , "Error format. (you need 3D short,float,double)") ; +/* + BBTK_BEGIN_TEMPLATE_SWITCH(t) + BBTK_SWITCH_ITK_IMAGE_short_3(t,this->Process,) + BBTK_SWITCH_ITK_IMAGE_float_3(t,this->Process,) + BBTK_SWITCH_ITK_IMAGE_double_3(t,this->Process,) + BBTK_END_TEMPLATE_SWITCH(t) +*/ + } + + //=================================================== + template + void NormalizedCorrelationImageToImageMetric::Process() + { + printf("EED NormalizedCorrelationImageToImageMetric::Process Start \n"); + using FloatImageType = itk::Image; + typedef T ImageType; + T* in1 = this->bbGetInputIn1().get(); + T* in2 = this->bbGetInputIn2().get(); + + using CorrelationFilterType = itk::FFTNormalizedCorrelationImageFilter; + auto correlationFilter = CorrelationFilterType::New(); + correlationFilter->SetFixedImage( in1 ); + correlationFilter->SetMovingImage( in2 ); + correlationFilter->Update(); + + + using RescaleFilterType = itk::RescaleIntensityImageFilter; + auto rescaleFilter = RescaleFilterType::New(); + rescaleFilter->SetInput(correlationFilter->GetOutput()); + rescaleFilter->SetOutputMinimum(0); + rescaleFilter->SetOutputMaximum(255); + rescaleFilter->Update(); + // itk::WriteImage(rescaleFilter->GetOutput(), "correlation.png"); + + using MinimumMaximumImageCalculatorType = itk::MinimumMaximumImageCalculator; + MinimumMaximumImageCalculatorType::Pointer minimumMaximumImageCalculatorFilter = MinimumMaximumImageCalculatorType::New(); + minimumMaximumImageCalculatorFilter->SetImage(correlationFilter->GetOutput()); + minimumMaximumImageCalculatorFilter->Compute(); + + itk::Index<3> maximumCorrelationPatchCenter = minimumMaximumImageCalculatorFilter->GetIndexOfMaximum(); + itk::Size<3> outputSize = correlationFilter->GetOutput()->GetLargestPossibleRegion().GetSize(); + itk::Index<3> maximumCorrelationPatchCenterFixed; + maximumCorrelationPatchCenterFixed[0] = outputSize[0] / 2 - maximumCorrelationPatchCenter[0]; + maximumCorrelationPatchCenterFixed[1] = outputSize[1] / 2 - maximumCorrelationPatchCenter[1]; + maximumCorrelationPatchCenterFixed[2] = outputSize[2] / 2 - maximumCorrelationPatchCenter[2]; + + std::cout << "Maximum location: " << maximumCorrelationPatchCenter << std::endl; + std::cout << "Maximum location fixed: " << maximumCorrelationPatchCenterFixed << std::endl; // This is the value we expect! + std::cout << "Maximum value: " << minimumMaximumImageCalculatorFilter->GetMaximum() << std::endl; // If the images can be perfectly aligned, the value is 1 + + this->bbSetOutputOut( minimumMaximumImageCalculatorFilter->GetMaximum() ); + printf("EED NormalizedCorrelationImageToImageMetric::Process End \n"); + + } + + //----------------------------------------------------------------- + void NormalizedCorrelationImageToImageMetric::bbUserSetDefaultValues() + { + } + + //----------------------------------------------------------------- + void NormalizedCorrelationImageToImageMetric::bbUserInitializeProcessing() + { + } + + //----------------------------------------------------------------- + void NormalizedCorrelationImageToImageMetric::bbUserFinalizeProcessing() + { + } + +}// EO namespace bbitk +#endif // __bbitkNormalizedCorrelationImageToImageMetric_h_INCLUDED__ +