test.py 4.52 KB
Newer Older
Pedro TOME's avatar
Pedro TOME committed
1 2 3 4
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :


5 6 7 8 9 10 11 12
"""Unit tests against references extracted from

Matlab code from Bram Ton available on the matlab central website:

https://www.mathworks.com/matlabcentral/fileexchange/35754-wide-line-detector

This code implements the detector described in [HDLTL10] (see the references in
the generated sphinx documentation)
Pedro TOME's avatar
Pedro TOME committed
13 14 15
"""

import os
16 17 18
import numpy
import nose.tools

Pedro TOME's avatar
Pedro TOME committed
19 20
import pkg_resources

21 22
import bob.io.base
import bob.io.matlab
André Anjos's avatar
André Anjos committed
23
import bob.io.image
Pedro TOME's avatar
Pedro TOME committed
24 25


26 27 28 29 30 31 32 33
def F(parts):
  """Returns the test file path"""

  return pkg_resources.resource_filename(__name__, os.path.join(*parts))


def test_finger_crop():

André Anjos's avatar
André Anjos committed
34 35
  input_filename = F(('preprocessors', '0019_3_1_120509-160517.png'))
  output_img_filename  = F(('preprocessors',
36
    '0019_3_1_120509-160517_img_lee_huang.mat'))
André Anjos's avatar
André Anjos committed
37
  output_fvr_filename  = F(('preprocessors',
38 39 40 41
    '0019_3_1_120509-160517_fvr_lee_huang.mat'))

  img = bob.io.base.load(input_filename)

André Anjos's avatar
André Anjos committed
42
  from bob.bio.vein.preprocessors.FingerCrop import FingerCrop
43
  preprocess = FingerCrop(fingercontour='leemaskMatlab')
44

45
  output_img, finger_mask_norm = preprocess(img)
46 47 48 49 50 51 52 53 54 55 56 57 58 59

  # Load Matlab reference
  output_img_ref = bob.io.base.load(output_img_filename)
  output_fvr_ref = bob.io.base.load(output_fvr_filename)

  # Compare output of python's implementation to matlab reference
  # (loose comparison!)
  assert numpy.mean(numpy.abs(output_img - output_img_ref)) < 1e2


def test_miuramax():

  #Maximum Curvature method against Matlab reference

André Anjos's avatar
André Anjos committed
60 61 62
  input_img_filename  = F(('extractors', 'miuramax_input_img.mat'))
  input_fvr_filename  = F(('extractors', 'miuramax_input_fvr.mat'))
  output_filename     = F(('extractors', 'miuramax_output.mat'))
63 64 65 66 67 68

  # Load inputs
  input_img = bob.io.base.load(input_img_filename)
  input_fvr = bob.io.base.load(input_fvr_filename)

  # Apply Python implementation
André Anjos's avatar
André Anjos committed
69
  from bob.bio.vein.extractors.MaximumCurvature import MaximumCurvature
70 71 72 73 74 75 76 77 78
  MC = MaximumCurvature(5, False)
  output_img = MC((input_img, input_fvr))

  # Load Matlab reference
  output_img_ref = bob.io.base.load(output_filename)

  # Compare output of python's implementation to matlab reference
  # (loose comparison!)
  assert numpy.mean(numpy.abs(output_img - output_img_ref)) < 8e-3
Pedro TOME's avatar
Pedro TOME committed
79 80


81 82 83 84
def test_miurarlt():

  #Repeated Line Tracking method against Matlab reference

André Anjos's avatar
André Anjos committed
85 86 87
  input_img_filename  = F(('extractors', 'miurarlt_input_img.mat'))
  input_fvr_filename  = F(('extractors', 'miurarlt_input_fvr.mat'))
  output_filename     = F(('extractors', 'miurarlt_output.mat'))
88 89 90 91 92 93

  # Load inputs
  input_img = bob.io.base.load(input_img_filename)
  input_fvr = bob.io.base.load(input_fvr_filename)

  # Apply Python implementation
André Anjos's avatar
André Anjos committed
94
  from bob.bio.vein.extractors.RepeatedLineTracking import RepeatedLineTracking
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
  RLT = RepeatedLineTracking(3000, 1, 21, False)
  output_img = RLT((input_img, input_fvr))

  # Load Matlab reference
  output_img_ref = bob.io.base.load(output_filename)

  # Compare output of python's implementation to matlab reference
  # (loose comparison!)
  assert numpy.mean(numpy.abs(output_img - output_img_ref)) < 0.5


def test_huangwl():

  #Wide Line Detector method against Matlab reference

André Anjos's avatar
André Anjos committed
110 111 112
  input_img_filename  = F(('extractors', 'huangwl_input_img.mat'))
  input_fvr_filename  = F(('extractors', 'huangwl_input_fvr.mat'))
  output_filename     = F(('extractors', 'huangwl_output.mat'))
113 114 115 116 117 118

  # Load inputs
  input_img = bob.io.base.load(input_img_filename)
  input_fvr = bob.io.base.load(input_fvr_filename)

  # Apply Python implementation
André Anjos's avatar
André Anjos committed
119
  from bob.bio.vein.extractors.WideLineDetector import WideLineDetector
120 121 122 123 124 125 126 127 128 129 130 131
  WL = WideLineDetector(5, 1, 41, False)
  output_img = WL((input_img, input_fvr))

  # Load Matlab reference
  output_img_ref = bob.io.base.load(output_filename)

  # Compare output of python's implementation to matlab reference
  assert numpy.allclose(output_img, output_img_ref)


def test_miura_match():

André Anjos's avatar
André Anjos committed
132 133 134 135 136
  #Match Ratio method against Matlab reference

  template_filename = F(('algorithms', '0001_2_1_120509-135338.mat'))
  probe_gen_filename = F(('algorithms', '0001_2_2_120509-135558.mat'))
  probe_imp_filename = F(('algorithms', '0003_2_1_120509-141255.mat'))
137 138 139 140 141

  template_vein = bob.io.base.load(template_filename)
  probe_gen_vein = bob.io.base.load(probe_gen_filename)
  probe_imp_vein = bob.io.base.load(probe_imp_filename)

André Anjos's avatar
André Anjos committed
142
  from bob.bio.vein.algorithms.MiuraMatch import MiuraMatch
143 144 145 146 147 148 149
  MM = MiuraMatch(ch=18, cw=28)
  score_gen = MM.score(template_vein, probe_gen_vein)

  assert numpy.isclose(score_gen, 0.382689335394127)

  score_imp = MM.score(template_vein, probe_imp_vein)
  assert numpy.isclose(score_imp, 0.172906739278421)