diff --git a/skimage/feature/corner.py b/skimage/feature/corner.py index 15aac545..1e7968d9 100644 --- a/skimage/feature/corner.py +++ b/skimage/feature/corner.py @@ -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 diff --git a/skimage/feature/tests/test_corner.py b/skimage/feature/tests/test_corner.py index fa8ddd17..66ef41c6 100644 --- a/skimage/feature/tests/test_corner.py +++ b/skimage/feature/tests/test_corner.py @@ -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()