test.py 5.1 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
def F(parts):
  """Returns the test file path"""

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


32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
def _show_mask_over_image(image, mask, color='red'):
  """Plots the mask over the image of a finger, for debugging purposes

  Parameters:

    image (numpy.ndarray): A 2D numpy.ndarray compose of 8-bit unsigned
      integers containing the original image

    mask (numpy.ndarray): A 2D numpy.ndarray compose of boolean values
      containing the calculated mask

  """

  from PIL import Image
  img = Image.fromarray(image).convert(mode='RGBA')
  msk = Image.fromarray((~mask).astype('uint8')*80)
  red = Image.new('RGBA', img.size, color=color)
  img.paste(red, mask=msk)
  img.show()


53 54
def test_finger_crop():

André Anjos's avatar
André Anjos committed
55 56
  input_filename = F(('preprocessors', '0019_3_1_120509-160517.png'))
  output_img_filename  = F(('preprocessors',
57
    '0019_3_1_120509-160517_img_lee_huang.mat'))
André Anjos's avatar
André Anjos committed
58
  output_fvr_filename  = F(('preprocessors',
59 60 61 62
    '0019_3_1_120509-160517_fvr_lee_huang.mat'))

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

André Anjos's avatar
André Anjos committed
63
  from bob.bio.vein.preprocessors.FingerCrop import FingerCrop
64
  preprocess = FingerCrop(fingercontour='leemaskMatlab', padding_width=0)
65

66 67
  preproc, mask = preprocess(img)
  #_show_mask_over_image(preproc, mask)
68

69 70
  mask_ref = bob.io.base.load(output_fvr_filename)
  preproc_ref = bob.io.base.load(output_img_filename)
71

72 73 74
  # Very loose comparison!
  assert numpy.mean(numpy.abs(mask.astype('float64') - mask_ref)) < 1e-2
  assert numpy.mean(numpy.abs(preproc - preproc_ref)) < 1e2
75 76 77 78 79 80


def test_miuramax():

  #Maximum Curvature method against Matlab reference

André Anjos's avatar
André Anjos committed
81 82 83
  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'))
84 85 86 87 88 89

  # 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
90
  from bob.bio.vein.extractors.MaximumCurvature import MaximumCurvature
91
  MC = MaximumCurvature(5)
92 93 94 95 96 97 98 99
  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
100 101


102 103 104 105
def test_miurarlt():

  #Repeated Line Tracking method against Matlab reference

André Anjos's avatar
André Anjos committed
106 107 108
  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'))
109 110 111 112 113 114

  # 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
115
  from bob.bio.vein.extractors.RepeatedLineTracking import RepeatedLineTracking
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
  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
131 132 133
  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'))
134 135 136 137 138 139

  # 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
140
  from bob.bio.vein.extractors.WideLineDetector import WideLineDetector
141 142 143 144 145 146 147 148 149 150 151 152
  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
153 154 155 156 157
  #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'))
158 159 160 161 162

  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
163
  from bob.bio.vein.algorithms.MiuraMatch import MiuraMatch
164 165 166 167 168 169 170
  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)