Files
scikit-image/skimage/feature/tests/test_match.py
T

186 lines
7.0 KiB
Python

import numpy as np
from numpy.testing import assert_array_equal, assert_raises
from skimage import data
from skimage import transform as tf
from skimage.color import rgb2gray
from skimage.feature import (descriptor_brief, match_binary_descriptors,
corner_peaks, corner_harris,
create_keypoint_recarray)
def test_match_binary_descriptors_unequal_descriptor_keypoints_error():
"""Number of descriptors should be equal to the number of keypoints."""
kp1 = np.array([[40, 50],
[60, 40],
[30, 70]])
keypoints1 = create_keypoint_recarray(kp1[:, 0], kp1[:, 1])
des1 = np.array([[True, True, False, True],
[False, True, False, True]])
kp2 = np.array([[60, 50],
[50, 80]])
keypoints2 = create_keypoint_recarray(kp2[:, 0], kp2[:, 1])
des2 = np.array([[True, False, False, True],
[False, True, True, True]])
assert_raises(ValueError, match_binary_descriptors, keypoints1, des1, keypoints2, des2)
def test_match_binary_descriptors_unequal_descriptor_sizes_error():
"""Sizes of descriptors of keypoints to be matched should be equal."""
kp1 = np.array([[40, 50],
[60, 40]])
keypoints1 = create_keypoint_recarray(kp1[:, 0], kp1[:, 1])
des1 = np.array([[True, True, False, True],
[False, True, False, True]])
kp2 = np.array([[60, 50],
[50, 80]])
keypoints2 = create_keypoint_recarray(kp2[:, 0], kp2[:, 1])
des2 = np.array([[True, False, False, True, False],
[False, True, True, True, False]])
assert_raises(ValueError, match_binary_descriptors, keypoints1, des1, keypoints2, des2)
def test_match_binary_descriptors_lena_rotation_crosscheck_false():
"""Verify matched keypoints and their corresponding masks results between
lena image and its rotated version with the expected keypoint pairs with
cross_check disabled."""
img = data.lena()
img = rgb2gray(img)
tform = tf.SimilarityTransform(scale=1, rotation=0.15, translation=(0, 0))
rotated_img = tf.warp(img, tform)
kp1 = corner_peaks(corner_harris(img), min_distance=5)
keypoints1 = create_keypoint_recarray(kp1[:, 0], kp1[:, 1])
descriptors1, keypoints1 = descriptor_brief(img, keypoints1,
descriptor_size=512)
kp2 = corner_peaks(corner_harris(rotated_img), min_distance=5)
keypoints2 = create_keypoint_recarray(kp2[:, 0], kp2[:, 1])
descriptors2, keypoints2 = descriptor_brief(rotated_img, keypoints2,
descriptor_size=512)
matched_keypoints, m1, m2 = match_binary_descriptors(keypoints1,
descriptors1,
keypoints2,
descriptors2,
threshold=0.13,
cross_check=False)
expected_mask1 = np.array([11, 12, 16, 20, 24, 26, 27, 29, 35, 39, 40,
42, 45])
expected_mask2 = np.array([ 1, 3, 0, 4, 6, 7, 8, 9, 10, 10, 11,
12, 13])
expected = np.array([[[245, 141],
[221, 176]],
[[247, 130],
[225, 165]],
[[263, 272],
[219, 309]],
[[271, 120],
[250, 159]],
[[311, 174],
[282, 218]],
[[323, 164],
[294, 210]],
[[327, 147],
[301, 195]],
[[377, 157],
[349, 211]],
[[414, 70],
[399, 131]],
[[425, 67],
[399, 131]],
[[435, 181],
[403, 244]],
[[454, 176],
[423, 242]],
[[467, 166],
[437, 234]]])
assert_array_equal(matched_keypoints, expected)
assert_array_equal(m1, expected_mask1)
assert_array_equal(m2, expected_mask2)
def test_match_binary_descriptors_lena_rotation_crosscheck_true():
"""Verify matched keypoints and their corresponding masks results between
lena image and its rotated version with the expected keypoint pairs with
cross_check enabled."""
img = data.lena()
img = rgb2gray(img)
tform = tf.SimilarityTransform(scale=1, rotation=0.15, translation=(0, 0))
rotated_img = tf.warp(img, tform)
kp1 = corner_peaks(corner_harris(img), min_distance=5)
keypoints1 = create_keypoint_recarray(kp1[:, 0], kp1[:, 1])
descriptors1, keypoints1 = descriptor_brief(img, keypoints1, descriptor_size=512)
kp2 = corner_peaks(corner_harris(rotated_img), min_distance=5)
keypoints2 = create_keypoint_recarray(kp2[:, 0], kp2[:, 1])
descriptors2, keypoints2 = descriptor_brief(rotated_img, keypoints2,
descriptor_size=512)
matched_keypoints, m1, m2 = match_binary_descriptors(keypoints1,
descriptors1,
keypoints2,
descriptors2,
threshold=0.13)
expected = np.array([[[245, 141],
[221, 176]],
[[247, 130],
[225, 165]],
[[263, 272],
[219, 309]],
[[271, 120],
[250, 159]],
[[311, 174],
[282, 218]],
[[323, 164],
[294, 210]],
[[327, 147],
[301, 195]],
[[377, 157],
[349, 211]],
[[414, 70],
[399, 131]],
[[435, 181],
[403, 244]],
[[454, 176],
[423, 242]],
[[467, 166],
[437, 234]]])
expected_mask1 = np.array([11, 12, 16, 20, 24, 26, 27, 29, 35, 40, 42, 45])
expected_mask2 = np.array([ 1, 3, 0, 4, 6, 7, 8, 9, 10, 11, 12, 13])
assert_array_equal(matched_keypoints, expected)
assert_array_equal(m1, expected_mask1)
assert_array_equal(m2, expected_mask2)
if __name__ == '__main__':
from numpy import testing
testing.run_module_suite()