Files
scikit-image/skimage/feature/template.py
T
2012-05-08 21:32:05 -04:00

85 lines
2.7 KiB
Python

"""template.py - Template matching
"""
import numpy as np
import _template
try:
import cv
opencv_available = True
except ImportError:
opencv_available = False
#XXX add to opencv backend once backend system in place
def match_template_cv(image, template, out=None, method="norm-coeff"):
"""Finds a template in an image using normalized correlation.
Parameters
----------
image : array_like, dtype=float
Image to process.
template : array_like, dtype=float
Template to locate.
out: array_like, dtype=float, optional
Optional destination.
Returns
-------
output : ndarray, dtype=float
Correlation results between 0.0 and 1.0, maximum indicating the most
probable match.
"""
if not opencv_available:
raise ImportError("Opencv 2.0+ required")
if out == None:
out = np.empty((image.shape[0] - template.shape[0] + 1,
image.shape[1] - template.shape[1] + 1),
dtype=image.dtype)
if method == "norm-corr":
cv.MatchTemplate(image, template, out, cv.CV_TM_CCORR_NORMED)
elif method == "norm-coeff":
cv.MatchTemplate(image, template, out, cv.CV_TM_CCOEFF_NORMED)
else:
raise ValueError("Unknown template method: %s" % method)
return out
def match_template(image, template, method="norm-coeff"):
"""Finds a template in an image using normalized correlation.
Parameters
----------
image : array_like, dtype=float
Image to process.
template : array_like, dtype=float
Template to locate.
method: str (default 'norm-coeff')
The correlation method used in scanning.
T represents the template, I the image and R the result.
The summation is done over X = 0..w-1 and Y = 0..h-1 of the template.
'norm-coeff':
R(x, y) = Sigma(X,Y)[T(X, Y).I(x + X, y + Y)] / N
N = sqrt(Sigma(X,Y)[T(X, Y)**2].Sigma(X,Y)[I(x + X, y + Y)**2])
'norm-corr':
R(x,y) = Sigma(X,y)[T'(X, Y).I'(x + X, y + Y)] / N
N = sqrt(Sigma(X,y)[T'(X, Y)**2].Sigma(X,Y)[I'(x + X, y + Y)**2])
where:
T'(x, y) = T(X, Y) - 1/(w.h).Sigma(X',Y')[T(X', Y')]
I'(x + X, y + Y) = I(x + X, y + Y)
- 1/(w.h).Sigma(X',Y')[I(x + X', y + Y')]
Returns
-------
output : ndarray, dtype=float
Correlation results between 0.0 and 1.0, maximum indicating the most
probable match.
"""
if method == "norm-corr":
method_num = 0
elif method == "norm-coeff":
method_num = 1
else:
raise ValueError("Unknown template method: %s" % method)
return _template.match_template(image, template, method_num)