132 lines
5.9 KiB
Python
132 lines
5.9 KiB
Python
|
import pytest
|
||
|
import numpy as np
|
||
|
|
||
|
from skimage._shared.testing import assert_equal, assert_almost_equal
|
||
|
from skimage.feature import ORB
|
||
|
from skimage._shared import testing
|
||
|
from skimage import data
|
||
|
from skimage._shared.testing import test_parallel, xfail, arch32
|
||
|
from skimage.util.dtype import _convert
|
||
|
|
||
|
|
||
|
img = data.coins()
|
||
|
|
||
|
|
||
|
@test_parallel()
|
||
|
@pytest.mark.parametrize('dtype', ['float32', 'float64', 'uint8',
|
||
|
'uint16', 'int64'])
|
||
|
def test_keypoints_orb_desired_no_of_keypoints(dtype):
|
||
|
_img = _convert(img, dtype)
|
||
|
detector_extractor = ORB(n_keypoints=10, fast_n=12, fast_threshold=0.20)
|
||
|
detector_extractor.detect(_img)
|
||
|
|
||
|
exp_rows = np.array([141., 108., 214.56, 131., 214.272, 67.,
|
||
|
206., 177., 108., 141.])
|
||
|
exp_cols = np.array([323., 328., 282.24, 292., 281.664, 85.,
|
||
|
260., 284., 328.8, 267.])
|
||
|
|
||
|
exp_scales = np.array([1, 1, 1.44, 1, 1.728, 1, 1, 1, 1.2, 1])
|
||
|
|
||
|
exp_orientations = np.array([-53.97446153, 59.5055285, -96.01885186,
|
||
|
-149.70789506, -94.70171899, -45.76429535,
|
||
|
-51.49752849, 113.57081195, 63.30428063,
|
||
|
-79.56091118])
|
||
|
exp_response = np.array([1.01168357, 0.82934145, 0.67784179, 0.57176438,
|
||
|
0.56637459, 0.52248355, 0.43696175, 0.42992376,
|
||
|
0.37700486, 0.36126832])
|
||
|
|
||
|
assert_almost_equal(exp_rows, detector_extractor.keypoints[:, 0])
|
||
|
assert_almost_equal(exp_cols, detector_extractor.keypoints[:, 1])
|
||
|
assert_almost_equal(exp_scales, detector_extractor.scales)
|
||
|
assert_almost_equal(exp_response, detector_extractor.responses, 5)
|
||
|
assert_almost_equal(exp_orientations,
|
||
|
np.rad2deg(detector_extractor.orientations), 4)
|
||
|
|
||
|
detector_extractor.detect_and_extract(img)
|
||
|
assert_almost_equal(exp_rows, detector_extractor.keypoints[:, 0])
|
||
|
assert_almost_equal(exp_cols, detector_extractor.keypoints[:, 1])
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize('dtype', ['float32', 'float64', 'uint8',
|
||
|
'uint16', 'int64'])
|
||
|
def test_keypoints_orb_less_than_desired_no_of_keypoints(dtype):
|
||
|
_img = _convert(img, dtype)
|
||
|
detector_extractor = ORB(n_keypoints=15, fast_n=12,
|
||
|
fast_threshold=0.33, downscale=2, n_scales=2)
|
||
|
detector_extractor.detect(_img)
|
||
|
|
||
|
exp_rows = np.array([108., 203., 140., 65., 58.])
|
||
|
exp_cols = np.array([293., 267., 202., 130., 291.])
|
||
|
|
||
|
exp_scales = np.array([1., 1., 1., 1., 1.])
|
||
|
|
||
|
exp_orientations = np.array([151.93906, -56.90052, -79.46341,
|
||
|
-59.42996, -158.26941])
|
||
|
|
||
|
exp_response = np.array([-0.1764169, 0.2652126, -0.0324343,
|
||
|
0.0400902, 0.2667641])
|
||
|
|
||
|
assert_almost_equal(exp_rows, detector_extractor.keypoints[:, 0])
|
||
|
assert_almost_equal(exp_cols, detector_extractor.keypoints[:, 1])
|
||
|
assert_almost_equal(exp_scales, detector_extractor.scales)
|
||
|
assert_almost_equal(exp_response, detector_extractor.responses)
|
||
|
assert_almost_equal(exp_orientations,
|
||
|
np.rad2deg(detector_extractor.orientations), 3)
|
||
|
|
||
|
detector_extractor.detect_and_extract(img)
|
||
|
assert_almost_equal(exp_rows, detector_extractor.keypoints[:, 0])
|
||
|
assert_almost_equal(exp_cols, detector_extractor.keypoints[:, 1])
|
||
|
|
||
|
|
||
|
@xfail(condition=arch32,
|
||
|
reason=('Known test failure on 32-bit platforms. See links for '
|
||
|
'details: '
|
||
|
'https://github.com/scikit-image/scikit-image/issues/3091 '
|
||
|
'https://github.com/scikit-image/scikit-image/issues/2529'))
|
||
|
def test_descriptor_orb():
|
||
|
detector_extractor = ORB(fast_n=12, fast_threshold=0.20)
|
||
|
exp_descriptors = np.array([[0, 0, 0, 1, 0, 0, 0, 1, 0, 1],
|
||
|
[1, 1, 0, 1, 0, 0, 0, 1, 0, 1],
|
||
|
[1, 1, 0, 0, 1, 0, 0, 0, 1, 1],
|
||
|
[1, 1, 1, 0, 0, 0, 1, 1, 1, 0],
|
||
|
[0, 0, 0, 1, 0, 1, 1, 1, 1, 1],
|
||
|
[1, 0, 0, 1, 1, 0, 0, 0, 1, 0],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
|
||
|
[1, 1, 1, 0, 1, 1, 1, 1, 0, 0],
|
||
|
[1, 1, 1, 1, 0, 0, 0, 1, 1, 1],
|
||
|
[0, 1, 1, 0, 0, 1, 1, 0, 1, 1],
|
||
|
[1, 1, 0, 0, 0, 0, 0, 0, 1, 1],
|
||
|
[1, 0, 0, 0, 0, 1, 0, 1, 1, 1],
|
||
|
[1, 0, 1, 1, 1, 0, 1, 0, 1, 0],
|
||
|
[0, 0, 1, 1, 0, 0, 0, 0, 1, 1],
|
||
|
[0, 1, 1, 0, 0, 0, 1, 0, 0, 1],
|
||
|
[0, 1, 1, 0, 0, 0, 1, 1, 1, 1],
|
||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||
|
[0, 0, 1, 1, 1, 1, 0, 1, 1, 0],
|
||
|
[0, 0, 1, 1, 1, 0, 1, 0, 0, 1],
|
||
|
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=bool)
|
||
|
|
||
|
detector_extractor.detect(img)
|
||
|
detector_extractor.extract(img, detector_extractor.keypoints,
|
||
|
detector_extractor.scales,
|
||
|
detector_extractor.orientations)
|
||
|
|
||
|
assert_equal(exp_descriptors,
|
||
|
detector_extractor.descriptors[100:120, 10:20])
|
||
|
|
||
|
detector_extractor.detect_and_extract(img)
|
||
|
assert_equal(exp_descriptors,
|
||
|
detector_extractor.descriptors[100:120, 10:20])
|
||
|
keypoints_count = detector_extractor.keypoints.shape[0]
|
||
|
assert keypoints_count == detector_extractor.descriptors.shape[0]
|
||
|
assert keypoints_count == detector_extractor.orientations.shape[0]
|
||
|
assert keypoints_count == detector_extractor.responses.shape[0]
|
||
|
assert keypoints_count == detector_extractor.scales.shape[0]
|
||
|
|
||
|
|
||
|
def test_no_descriptors_extracted_orb():
|
||
|
img = np.ones((128, 128))
|
||
|
detector_extractor = ORB()
|
||
|
with testing.raises(RuntimeError):
|
||
|
detector_extractor.detect_and_extract(img)
|