test.py 5.5 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
def _show_image(image):
  """Shows a single image

  Parameters:

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

  """

  from PIL import Image
  img = Image.fromarray(image)
  img.show()


47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
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()


68 69
def test_finger_crop():

André Anjos's avatar
André Anjos committed
70 71
  input_filename = F(('preprocessors', '0019_3_1_120509-160517.png'))
  output_img_filename  = F(('preprocessors',
72
    '0019_3_1_120509-160517_img_lee_huang.mat'))
André Anjos's avatar
André Anjos committed
73
  output_fvr_filename  = F(('preprocessors',
74 75 76 77
    '0019_3_1_120509-160517_fvr_lee_huang.mat'))

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

78
  from bob.bio.vein.preprocessor.FingerCrop import FingerCrop
79
  preprocess = FingerCrop(fingercontour='leemaskMatlab', padding_width=0)
80

81 82
  preproc, mask = preprocess(img)
  #_show_mask_over_image(preproc, mask)
83

84 85 86 87 88
  mask_ref = bob.io.base.load(output_fvr_filename).astype('bool')
  preproc_ref = bob.core.convert(bob.io.base.load(output_img_filename),
      numpy.uint8, (0,255), (0.0,1.0))

  assert numpy.mean(numpy.abs(mask - mask_ref)) < 1e-2
89

90
  # Very loose comparison!
91 92
  #_show_image(numpy.abs(preproc.astype('int16') - preproc_ref.astype('int16')).astype('uint8'))
  assert numpy.mean(numpy.abs(preproc - preproc_ref)) < 1.3e2
93 94 95 96 97 98


def test_miuramax():

  #Maximum Curvature method against Matlab reference

André Anjos's avatar
André Anjos committed
99 100 101
  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'))
102 103 104 105 106 107

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

  # Apply Python implementation
108
  from bob.bio.vein.extractor.MaximumCurvature import MaximumCurvature
109
  MC = MaximumCurvature(5)
110 111 112 113 114 115 116 117
  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
118 119


120 121 122 123
def test_miurarlt():

  #Repeated Line Tracking method against Matlab reference

André Anjos's avatar
André Anjos committed
124 125 126
  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'))
127 128 129 130 131 132

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

  # Apply Python implementation
133
  from bob.bio.vein.extractor.RepeatedLineTracking import RepeatedLineTracking
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
  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
149 150 151
  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'))
152 153 154 155 156 157

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

  # Apply Python implementation
158
  from bob.bio.vein.extractor.WideLineDetector import WideLineDetector
159 160 161 162 163 164 165 166 167 168 169 170
  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
171 172 173 174 175
  #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'))
176 177 178 179 180

  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)

181
  from bob.bio.vein.algorithm.MiuraMatch import MiuraMatch
182 183 184 185 186 187 188
  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)