scikit-image
179 строк · 5.6 Кб
1import numpy as np2import pytest3from numpy.testing import assert_almost_equal, assert_equal4
5from skimage import data6from skimage._shared.testing import run_in_parallel7from skimage.feature import SIFT8from skimage.util.dtype import _convert9
10img = data.coins()11
12
13@run_in_parallel()14@pytest.mark.parametrize('dtype', ['float32', 'float64', 'uint8', 'uint16', 'int64'])15def test_keypoints_sift(dtype):16_img = _convert(img, dtype)17detector_extractor = SIFT()18detector_extractor.detect_and_extract(_img)19
20exp_keypoint_rows = np.array([18, 18, 19, 22, 26, 26, 30, 31, 31, 32])21exp_keypoint_cols = np.array([331, 331, 325, 330, 310, 330, 205, 323, 149, 338])22
23exp_octaves = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])24
25exp_position_rows = np.array(26[2717.81909936,2817.81909936,2919.05454661,3021.85933727,3125.54800708,3226.25710504,3329.90826307,3430.78713806,3530.87953572,3631.72557969,37]38)39
40exp_position_cols = np.array(41[42331.49693187,43331.49693187,44325.24476016,45330.44616424,46310.33932904,47330.46155224,48204.74535177,49322.84100812,50149.43192282,51337.89643013,52]53)54
55exp_orientations = np.array(56[570.26391655,580.26391655,590.39134262,601.77063053,610.98637565,621.37997279,630.4919992,641.48615988,650.33753212,661.64859617,67]68)69
70exp_scales = np.array([2, 2, 1, 3, 3, 1, 2, 1, 1, 1])71
72exp_sigmas = np.array(73[741.35160379,751.35160379,760.94551567,771.52377498,781.55173233,790.93973722,801.37594124,811.06663786,821.04827034,831.0378916,84]85)86
87exp_scalespace_sigmas = np.array(88[89[0.8, 1.00793684, 1.26992084, 1.6, 2.01587368, 2.53984168],90[1.6, 2.01587368, 2.53984168, 3.2, 4.03174736, 5.07968337],91[3.2, 4.03174736, 5.07968337, 6.4, 8.06349472, 10.15936673],92[6.4, 8.06349472, 10.15936673, 12.8, 16.12698944, 20.31873347],93[12.8, 16.12698944, 20.31873347, 25.6, 32.25397888, 40.63746693],94[25.6, 32.25397888, 40.63746693, 51.2, 64.50795775, 81.27493386],95]96)97
98assert_almost_equal(exp_keypoint_rows, detector_extractor.keypoints[:10, 0])99assert_almost_equal(exp_keypoint_cols, detector_extractor.keypoints[:10, 1])100assert_almost_equal(exp_octaves, detector_extractor.octaves[:10])101assert_almost_equal(102exp_position_rows, detector_extractor.positions[:10, 0], decimal=4103)104assert_almost_equal(105exp_position_cols, detector_extractor.positions[:10, 1], decimal=4106)107assert_almost_equal(108exp_orientations, detector_extractor.orientations[:10], decimal=4109)110assert_almost_equal(exp_scales, detector_extractor.scales[:10])111assert_almost_equal(exp_sigmas, detector_extractor.sigmas[:10], decimal=4)112assert_almost_equal(113exp_scalespace_sigmas, detector_extractor.scalespace_sigmas, decimal=4114)115
116detector_extractor2 = SIFT()117detector_extractor2.detect(img)118detector_extractor2.extract(img)119assert_almost_equal(120detector_extractor.keypoints[:10, 0], detector_extractor2.keypoints[:10, 0]121)122assert_almost_equal(123detector_extractor.keypoints[:10, 0], detector_extractor2.keypoints[:10, 0]124)125
126
127def test_descriptor_sift():128detector_extractor = SIFT(n_hist=2, n_ori=4)129exp_descriptors = np.array(130[131[173, 30, 55, 32, 173, 16, 45, 82, 173, 154, 170, 173, 173, 169, 65, 110],132[173, 30, 55, 32, 173, 16, 45, 82, 173, 154, 170, 173, 173, 169, 65, 110],133[189, 52, 18, 18, 189, 11, 21, 55, 189, 75, 173, 91, 189, 65, 189, 162],134[172, 156, 185, 66, 92, 76, 78, 185, 185, 87, 88, 82, 98, 56, 96, 185],135[216, 19, 40, 9, 196, 7, 57, 36, 216, 56, 158, 29, 216, 42, 144, 154],136[169, 120, 169, 91, 129, 108, 169, 67, 169, 142, 111, 95, 169, 120, 69, 41],137[199, 10, 138, 44, 178, 11, 161, 34, 199, 113, 73, 64, 199, 82, 31, 178],138[154, 56, 154, 49, 144, 154, 154, 78, 154, 51, 154, 83, 154, 154, 154, 72],139[230, 46, 47, 21, 230, 15, 65, 95, 230, 52, 72, 51, 230, 19, 59, 130],140[141155,142117,143154,144102,145155,146155,14790,148110,149145,150127,151155,15250,15357,154155,155155,15670,157],158],159dtype=np.uint8,160)161
162detector_extractor.detect_and_extract(img)163
164assert_equal(exp_descriptors, detector_extractor.descriptors[:10])165
166keypoints_count = detector_extractor.keypoints.shape[0]167assert keypoints_count == detector_extractor.descriptors.shape[0]168assert keypoints_count == detector_extractor.orientations.shape[0]169assert keypoints_count == detector_extractor.octaves.shape[0]170assert keypoints_count == detector_extractor.positions.shape[0]171assert keypoints_count == detector_extractor.scales.shape[0]172assert keypoints_count == detector_extractor.scales.shape[0]173
174
175def test_no_descriptors_extracted_sift():176img = np.ones((128, 128))177detector_extractor = SIFT()178with pytest.raises(RuntimeError):179detector_extractor.detect_and_extract(img)180