IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit

2D Cross correlation calculated in the Fourier domain More...

IPSDKIPLFILTERING_API image::ImagePtr ipsdk::imaproc::filter::fastCrossCorrelation2dImg (const image::ImageConstPtr &pInImg, const image::ImageConstPtr &pInTemplateImg)
 wrapper function for 2D Cross correlation calculated in the Fourier domain More...
 
IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::fastCrossCorrelation2dImg (const image::ImageConstPtr &pInImg, const image::ImageConstPtr &pInTemplateImg, const image::ImagePtr &pOutRealImg)
 wrapper function for 2D Cross correlation calculated in the Fourier domain More...
 

Detailed Description

2D Cross correlation calculated in the Fourier domain

This algorithm computes the two dimensional Cross-Correlation (CC) between an image $ InImg2d $ and a template $ InTemplateImg $. To speed up the process, the calculation is performed in the frequency domain as follows :

\[ CC = \mathcal{F}^{-1}\left((\mathcal{F}(InImg2d - \mu_{InImg2d}) \overline{\mathcal{F}(InTemplateImg - \mu_{InTemplateImg})}\right) \]

Where $ \overline{I} $ is the configate of $I$, $ \mathcal{F}(I) $ represents the Fourier transform of an image $I$, $\mu_{InImg2d}$ is the local mean intensity of the input image in the neighbourhood defined by the template, $\mu_{InTemplateImg}$ is the template global mean intensity and $ \mathcal{F}^{-1} $ the inverse Fourier tranform.

The algorithm needs 4 working images with Real32 data to compute the Fourier transforms. If the template image is smaller than the reference image, it is padded before calculating its Fourier transform and two additional working images are used to store the padded template image.

Please, note that the results are not strictly identical to the Normalized Cross-Correlation 2d and the maximum is located at the origin of the template whereas it is located at the template center coordinates for the NCC. Moreover, unless the image and the template sizes are small, its implementation can be much faster, as show the following figure:

CC2d_bench.png

The performances has been calculated on a desktop computer with Intel(R) Core(TM) i9-10980XE 3GHz, 128Go RAM, Windows 10 64 bits.

Here is an example of an image, a template to match and the resulting fast CC :

CC2d.png
See also
http://en.wikipedia.org/wiki/Cross-correlation

Attributes description

Attribute description for algorithm :

Name ToolTip Default Initializer
ipsdk::imaproc::attr::InImg1 [Input] First image for processing operation X
ipsdk::imaproc::attr::InImg2 [Input] Second image for processing operation X
ipsdk::imaproc::attr::OutOptWk1RealImg [Output Optional] Temporary working image for algorithm (data contained in image buffer are reals) X
ipsdk::imaproc::attr::OutOptWk2RealImg [Output Optional] Temporary working image for algorithm (data contained in image buffer are reals) X
ipsdk::imaproc::attr::OutWk1RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk1RealImg, _pInImg1, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk2RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk2RealImg, _pInImg1, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk3RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk3RealImg, _pInImg1, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutWk4RealImg [Output] Temporary working image for algorithm ipsdk::imaproc::duplicateInOut (_pOutWk4RealImg, _pInImg1, ipsdk::image::eImageBufferType::eIBT_Real32)
ipsdk::imaproc::attr::OutRealImg [Output] image for processing operation (data contained in image buffer are reals) ipsdk::imaproc::duplicateInOut (_pOutRealImg, _pInImg1, ipsdk::image::eImageBufferType::eIBT_Real32)

Global Rule description

Global rule description for algorithm :
ipsdk::imaproc::customImageProperty (_pInImg2,
 fastCCRule3d (_pInImg1,_pInImg2)) && 
ipsdk::imaproc::matchSize (_pInImg1,_pOutWk1RealImg) && 
ipsdk::imaproc::matchSize (_pInImg1,_pOutWk2RealImg) && 
ipsdk::imaproc::matchSize (_pInImg1,_pOutWk3RealImg) && 
ipsdk::imaproc::matchSize (_pInImg1,_pOutWk4RealImg) && 
ipsdk::imaproc::matchSize (_pInImg1,_pOutRealImg) && 
(ipsdk::processor::ifIsSet (
  _pOutOptWk1RealImg, (
   ipsdk::imaproc::matchSize (_pInImg2,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pInImg2,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk1RealImg,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk2RealImg,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk3RealImg,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk4RealImg,_pOutOptWk1RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutRealImg,_pOutOptWk1RealImg)))) && 
(ipsdk::processor::ifIsSet (
  _pOutOptWk2RealImg, (
   ipsdk::imaproc::matchSize (_pInImg1,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pInImg1,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk1RealImg,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk2RealImg,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk3RealImg,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutWk4RealImg,_pOutOptWk2RealImg)) && 
  (ipsdk::imaproc::noInSitu (_pOutRealImg,_pOutOptWk2RealImg))))

Example of Python code :

Example imports

import PyIPSDK
import PyIPSDK.IPSDKIPLFiltering as filter

Code Example

# opening of input images
inImg = PyIPSDK.loadTiffImageFile(inputImgPath)
# normalized cross correlation 2d computation
outImg = filter.fastCrossCorrelation2dImg(inImg, templateImg)

Example of C++ code :

Example informations

Associated library

IPSDKIPLFiltering

Header file

Code Example

// Generate a random image
ImagePtr pInImg = loadTiffImageFile(inputImgPath);
// Compute the NCC
ImagePtr pOutImg = fastCrossCorrelation2dImg(pInImg, pTemplateImg);
See also
FastCrossCorrelation2dImgLvl1
FastCrossCorrelation2dImgLvl2

Function Documentation

◆ fastCrossCorrelation2dImg() [1/2]

IPSDKIPLFILTERING_API image::ImagePtr ipsdk::imaproc::filter::fastCrossCorrelation2dImg ( const image::ImageConstPtr pInImg,
const image::ImageConstPtr pInTemplateImg 
)

wrapper function for 2D Cross correlation calculated in the Fourier domain

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure

◆ fastCrossCorrelation2dImg() [2/2]

IPSDKIPLFILTERING_API void ipsdk::imaproc::filter::fastCrossCorrelation2dImg ( const image::ImageConstPtr pInImg,
const image::ImageConstPtr pInTemplateImg,
const image::ImagePtr pOutRealImg 
)

wrapper function for 2D Cross correlation calculated in the Fourier domain

Exceptions
ipsdk::processor::IPSDKBaseProcessingExceptionon failure