mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-08 16:00:31 +08:00
85 lines
2.7 KiB
Python
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)
|
|
|