diff --git a/bob/bio/vein/algorithm/HammingDistance.py b/bob/bio/vein/algorithm/HammingDistance.py index 6497cb8133b92e0151d1ad7879eecbcc35d79ddb..3ce7729ae816c74550c84c0e03fa9518ab1aa938 100644 --- a/bob/bio/vein/algorithm/HammingDistance.py +++ b/bob/bio/vein/algorithm/HammingDistance.py @@ -1,8 +1,24 @@ -# Calculates the Hamming distance (proportion of mismatching corresponding bits) between two binary vectors +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : -import bob.bio.base + +from bob.bio.base.algorithm import Distance import scipy.spatial.distance -algorithm = bob.bio.base.algorithm.Distance( - distance_function = scipy.spatial.distance.hamming, - is_distance_function = False # setting this to False ensures that Hamming distances are returned as positive values rather than negative -) \ No newline at end of file + + +class HammingDistance (Distance): + """Finger vein matching: Hamming Distance between binary fingervein feature vectors + """ + + def __init__( + self, + distance_function = scipy.spatial.distance.hamming, + is_distance_function = False # setting this to False ensures that Hamming distances are returned as positive values rather than negative + ): + + # Call base class constructor + Distance.__init__( + self, + distance_function = distance_function, + is_distance_function = is_distance_function + ) \ No newline at end of file diff --git a/bob/bio/vein/tests/test.py b/bob/bio/vein/tests/test.py index 8a594b22dfc5335b6091cd279b85d30ece16f113..fb4c4e1951236cfb4cb20d59158237934805c99e 100644 --- a/bob/bio/vein/tests/test.py +++ b/bob/bio/vein/tests/test.py @@ -685,3 +685,26 @@ def test_correlation(): total = time.clock() - start print('scipy+correlate2d, %d iterations - %.2e per iteration' % (N, total/N)) ''' + + +def test_hamming_distance(): + + from ..algorithm.HammingDistance import HammingDistance + HD = HammingDistance() + + # Tests on simple binary arrays: + # 1.) Maximum HD (1.0): + model_1 = numpy.array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0]) + probe_1 = numpy.array([[1, 0, 0, 0, 1, 0], [0, 1, 1, 1, 0, 1]]) + score_max = HD.score(model_1, probe_1) + assert score_max == 1.0 + # 2.) Minimum HD (0.0): + model_2 = numpy.array([0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1]) + probe_2 = numpy.array([[0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 0, 1]]) + score_min = HD.score(model_2, probe_2) + assert score_min == 0.0 + # 3.) HD of exactly half (0.5) + model_3 = numpy.array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0]) + probe_3 = numpy.array([[0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 0, 1]]) + score_half = HD.score(model_3, probe_3) + assert score_half == 0.5 \ No newline at end of file