Fix division by zero bug in corner detectors

This commit is contained in:
Johannes Schönberger
2013-06-23 23:39:20 +02:00
parent 113267bd4d
commit c9b2bd0aae
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()