SignalProcessing
CrossCorrelation2D
calculate the cross-correlation between a pair of one- or two-dimensional rtables
Calling Sequence
Parameters
Description
Examples
Compatibility
CrossCorrelation2D( A, B, options )
A, B
-
two one- or two-dimensional rtables
container
(optional) container to compute and store the cross-correlation
The CrossCorrelation2D command takes two 1-D or 2-D rtables and computes their 2-D cross-correlation.
The inputs are converted to Matrices of complex[8] datatype, and an error will be thrown if this is not possible. For this reason, it is most efficient for the inputs to already be Matrices having datatype complex[8].
The cross-correlation is computed via Discrete or Fast Fourier Transforms (DFTs or FFTs), but the result is equivalent to the standard definition (see example below). However, there may be numerical artifacts in the result that are small in size.
Suppose Matrices A and B, respectively, have dimensions (a,b) and (c,d), and define p=a+c-1 and q=b+d-1. Then, the cross-correlation Matrix of dimension (p,q) is given by the formula
Ci,j=∑r=1a⁡∑s=1b⁡Ar,s⁢Br−i+c,s−j+d&conjugate0;
where A is assumed to be zero outside of the range of indices (1..a,1..b), and B is assumed to be zero outside of the range of indices (1..c,1..d).
FFTs are used when p and q, where p and q are as in the definition above, are powers of 2 and no less than 4 in value. Consequently, if p and q are both a little smaller than a power of 2, the user may want to pad the original Matrices with zeros. See below for an example.
If the container=C option is provided, then the results are stored in C. The container must have dimensions (p,q), and datatype complex[8].
If A is empty with no elements, a and b are both taken to be zero. Similarly, c and d are both taken to be zero if B has no elements. If both A and B are empty, an error will be thrown because the cross-correlation would have no meaning. However, if, say, B is empty but A is not, then the cross-correlation would be a zero Matrix of size (a-1,b-1).
with⁡SignalProcessing:
Simple Examples
Example 1
A≔Vectorrow⁡1,2
A≔
B≔Matrix⁡3,−4,5⁢I,6
B≔
C≔CrossCorrelation2D⁡A,B
C≔
Example 2
A≔Matrix⁡1,2,3,4
B≔Matrix⁡1,2,3,4,5,6,7,8,9
C1≔CrossCorrelation2D⁡A,B
C1≔
C2≔CrossCorrelation2D⁡B,A
C2≔
Example 3
A≔Vectorrow⁡I,5,3−I
B≔Vectorrow⁡6−0.5⁢I,7
Example 4
A≔Matrix⁡1,2+7⁢I,3−I,4
B≔Array⁡5,6,7,8+3⁢I
C≔Matrix⁡3,3,datatype=complex8
CrossCorrelation2D⁡A,B,container=C:
C=C
C=
Direct Computation
To compute the cross-correlation directly from the definition, first take:
X≔Matrix⁡3,2,2,−2+I,−I,2−I,0,2−2⁢I
X≔
Y≔Matrix⁡4,3,1+I,2+2⁢I,−1−I,−2−I,1−I,−2⁢I,2⁢I,1+2⁢I,1+I,−1,−I,2−I
Y≔
a,b≔upperbound⁡X
a,b≔3,2
c,d≔upperbound⁡Y
c,d≔4,3
p≔a+c−1
p≔6
q≔b+d−1
q≔4
We will need to assume X and Y are both 0 when their indices are out of bounds, and take the complex conjugate of the Y values:
XX≔i,j↦`if`⁡i<1ora<iorj<1orb<j,0,Xi,j:
YY≔i,j↦`if`⁡i<1orc<iorj<1ord<j,0,conjugate⁡Yi,j:
The cross-correlation can now be found directly:
C1 := Matrix( p, q, proc(i,j) local r, s; add( add( XX(r,s) * YY(r-i+c,s-j+d), s = 1 .. b ), r = 1 .. a ); end proc ):
This corresponds to that found with the command:
C2≔CrossCorrelation2D⁡X,Y:
err≔max⁡abs⁡C1−C2
err≔3.55271367880050×10−15
Computation with Fast Fourier Transforms (FFTs)
The cross-correlation is computed with FFTs when the dimensions of the final Matrix, namely p and q above, are both powers of 2 and no smaller than 4 in size, and DFTs in the remainder of cases. In the following example, we will compute a cross-correlation both directly (which will use DFTs) and by padding one of the input Matrices (which will use FFTs). The indices 1 and 2 will be used to distinguish the original and padded versions of quantities.
First, define the original Matrices:
unassign⁡a,b,c,d,p,q,A,B,C
a1≔60:
b1≔62:
A1≔LinearAlgebra:-RandomMatrix⁡a1,b1,datatype=complex8:
c≔65:
d≔60:
B≔LinearAlgebra:-RandomMatrix⁡c,d,datatype=complex8:
Second, compute the cross-correlation with no padding:
C1≔CrossCorrelation2D⁡A1,B:
Now, the dimensions are just a little smaller than powers of 2:
p1≔a1+c−1
p1≔124
q1≔b1+d−1
q1≔121
So, we will pad A[1] (padding B would also work) so that the computed cross-correlation Matrix has dimensions that are powers of 2:
a2≔a1+2−ilog2⁡1max⁡4,p1−p1
a2≔64
b2≔b1+2−ilog2⁡1max⁡4,q1−q1
b2≔69
p2≔a2+c−1
p2≔128
q2≔b2+d−1
q2≔128
A2≔ArrayTools:-Alias⁡A1:
A2⁡a1+1..a2,..≔0:
A2⁡..,b1+1..b2≔0:
Finally, find the cross-correlation using FFTs, and extract the appropriate submatrix:
C2≔CrossCorrelation2D⁡A2,B..p1,..q1:
Both results are the same:
err≔8.16983452975878×10−10
Comparison with 1-D CrossCorrelation
The CrossCorrelation2D command can be reduced to the 1-D version with a couple of minor modifications. Take, for example, the following Vectors:
A≔Vectorrow⁡5,−2,3,4,1
B≔Vectorrow⁡7,0,2
b≔numelems⁡B
b≔3
The 2-D cross-correlation returns the following:
C__2D≔CrossCorrelation2D⁡A,B
C__2D≔
The 1-D cross-correlation, however, gives:
CrossCorrelation⁡A,B
If we switch the arguments for CrossCorrelation, and choose the appropriate value of lowerlag, the two cross-correlations agree:
C__1D≔CrossCorrelation⁡B,A,1−b
C__1D≔
Application to Fingerprint Matching
A classic application of two-dimensional cross-correlation is the lining up of two or more images, for example, images of fingerprint fragments. Consider the following image:
with⁡ImageTools:
imgfile≔cat⁡kernelopts⁡mapledir,kernelopts⁡dirsep,data,kernelopts⁡dirsep,images,kernelopts⁡dirsep,fingerprint.jpg:
img1≔Matrix⁡Read⁡imgfile,datatype=float8:
Preview⁡img1
First, determine the dimensions:
a,b≔upperbound⁡img1
a,b≔240,256
We will also use the mean later:
μ≔add⁡img1numelems⁡img1:
Second, let's choose some bounds for a fragment of the fingerprint, extract the subimage (fingerprint fragment), and then add some noise (to make our task a little more realistic):
cL≔85:
cU≔205:
dL≔120:
dU≔180:
img2≔Matrix⁡img1cL..cU,dL..dU+0.5⁢μ⁢ArrayTools:-RandomArray⁡cU−cL+1,dU−dL+1,distribution=normal,datatype=float8:
Preview⁡img2
Suppose now that we do not know whether the fragment is part of the larger image, and wish to determine if the fragment is a "match". To do this, compute the cross-correlation of the tempered data (formed by subtracting the mean from all elements):
C≔RealPart⁡CrossCorrelation2D⁡`~``-`⁡img1,` $`,μ,`~``-`⁡img2,` $`,μ:
The maximum correlation occurs here, which, as expected, coincides with the bottom-right corner of the fragment:
α,β≔maxindex⁡C
α,β≔205,180
Visually:
plots:-surfdata⁡C,title=Cross-Correlation - Full
r≔25:
plots:-surfdata⁡Cα−r..α+r,β−r..β+r,title=Cross-Correlation - Zoomed
The SignalProcessing[CrossCorrelation2D] command was introduced in Maple 2020.
For more information on Maple 2020 changes, see Updates in Maple 2020.
See Also
ArrayTools
ImageTools
plots
Download Help Document