Merge pull request #601 from ahojnnes/corner-eps

BUG: Fix division by zero bug in corner detectors.
This commit is contained in:
Stefan van der Walt
2013-06-23 15:42:16 -07:00
2 changed files with 31 additions and 5 deletions
+14 -4
View File
@@ -91,8 +91,13 @@ def corner_kitchen_rosenfeld(image):
imxx, imxy = _compute_derivatives(imx)
imyx, imyy = _compute_derivatives(imy)
response = (imxx * imy**2 + imyy * imx**2 - 2 * imxy * imx * imy) \
/ (imx**2 + imy**2)
numerator = (imxx * imy**2 + imyy * imx**2 - 2 * imxy * imx * imy)
denominator = (imx**2 + imy**2)
response = np.zeros_like(image, dtype=np.double)
mask = denominator != 0
response[mask] = numerator[mask] / denominator[mask]
return response
@@ -311,8 +316,13 @@ def corner_foerstner(image, sigma=1):
# trace
traceA = Axx + Ayy
w = detA / traceA
q = 4 * detA / traceA**2
w = np.zeros_like(image, dtype=np.double)
q = np.zeros_like(image, dtype=np.double)
mask = traceA != 0
w[mask] = detA[mask] / traceA[mask]
q[mask] = 4 * detA[mask] / traceA[mask]**2
return w, q
+17 -1
View File
@@ -5,7 +5,8 @@ from skimage import data
from skimage import img_as_float
from skimage.feature import (corner_moravec, corner_harris, corner_shi_tomasi,
corner_subpix, peak_local_max, corner_peaks)
corner_subpix, peak_local_max, corner_peaks,
corner_kitchen_rosenfeld, corner_foerstner)
def test_square_image():
@@ -124,6 +125,21 @@ def test_corner_peaks():
assert len(corners) == 4
def test_blank_image_nans():
"""Some of the corner detectors had a weakness in terms of returning
NaN when presented with regions of constant intensity. This should
be fixed by now. We test whether each detector returns something
finite in the case of constant input"""
detectors = [corner_moravec, corner_harris, corner_shi_tomasi,
corner_kitchen_rosenfeld, corner_foerstner]
constant_image = np.zeros((20, 20))
for det in detectors:
response = det(constant_image)
assert np.all(np.isfinite(response))
if __name__ == '__main__':
from numpy import testing
testing.run_module_suite()