mirror of
https://github.com/wassname/scikit-image.git
synced 2026-06-29 23:25:37 +08:00
Fix division by zero bug in corner detectors
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user