### Looking for topological features:

The skeleton of a binary shape can be used to find features to classify it. The number of endpoints or the number of branched points should be good candidates. A shape which skeleton has no endpoint nor no branched point could be a circle:
O

A shape with one branched point and no endpoint, may looks like this :
8

Binary model shapes were loaded in an ipython notebook with skimage which was capable of handling

Skeletons were generated by morphological thinning implemented in mahotas:

From the curve, the hand skeleton has 13 endpoints before any pruning, after 40 pruning steps, it has 6 endpoints. Around 90 pruning steps are necessary to remove all endpoints. By only looking at their curve, the hand shaped silhouette and the fish shaped silhouette are different.

From the images above, it is clear that the skeleton resists to scale variations but as the skeleton becomes smaller less pruning steps are necessary to "burn" it to the last pruned pixels set. So let's norme the pruning steps by the initial skeleton size such for 0 pruning step, the normed pruning step is 100. As the size of the hand shaped silhouette decreases (from 81%, 49%, 25%, 9% of the original size), the endpoints spectrums remain comparable:

The spectrums seem to resist to shape rotation (hand, hand-10°, hand90°) and to moderate shape deformation (hand-bent1,2). The sketch-hand silhouette is a right hand and its spectrum is comparable to the other spectrums which corresponds to left hands, so the endpoints spectrum is symetry invariant too.

A python function taking the steps list and the endpoints (spectrum) list yields a features vector :

And let's submit it the previous function :

The function yields the vector:

which means that the skeleton has:

*.pgm*format :Skeletons were generated by morphological thinning implemented in mahotas:

endpoints (blue), branched points (green) |

### Endpoints Spectrum :

The skeleton of the hand has two endpoints close to top of each fingers, as it would be fine to have one endpoint per finger, let's prune the skeleton to meet this condition. This can be achieved after some trial, however if robust features could be found from the skeleton a systematic method is needed. So, let's prune the skeleton until it has no endpoint and count the number of pruning step necessary:From the curve, the hand skeleton has 13 endpoints before any pruning, after 40 pruning steps, it has 6 endpoints. Around 90 pruning steps are necessary to remove all endpoints. By only looking at their curve, the hand shaped silhouette and the fish shaped silhouette are different.

#### Endpoints spectrum resists to scale variation after normalization:

As scale invariance is a nice feature, let's see what is happening when the scale of the shape is successively reduced by a factor of 0.9², 0.7², 0.5², 0.3²:From the images above, it is clear that the skeleton resists to scale variations but as the skeleton becomes smaller less pruning steps are necessary to "burn" it to the last pruned pixels set. So let's norme the pruning steps by the initial skeleton size such for 0 pruning step, the normed pruning step is 100. As the size of the hand shaped silhouette decreases (from 81%, 49%, 25%, 9% of the original size), the endpoints spectrums remain comparable:

#### Endpoints spectrum of similar shapes are similar:

How does the curve behave with similar shapes? Let's compare the endpoints spectrum of the serie of six hands:The spectrums seem to resist to shape rotation (hand, hand-10°, hand90°) and to moderate shape deformation (hand-bent1,2). The sketch-hand silhouette is a right hand and its spectrum is comparable to the other spectrums which corresponds to left hands, so the endpoints spectrum is symetry invariant too.

#### Deriving a features vector from endpoints spectrum:

If shapes should be classified according to their topology, the whole endpoints spectrum is not necessary and only the transitions may be retained. Taking a hypothetical skeleton whose endpoints spectrum before normalization is:- For 7 prunings the skeleton has 0 endpoints

- 6 1

- 2 3

- 0 4

(7,6,-1,2,0)

The value -1 indicates that the value 2 endpoints is missing. In the python script, the endpoints spectrum is coded as two lists:*end_points_test = [4,3,3,1,1,1,1,0]*

pruning_steps_test = [0,1,2,3,4,5,6,7]pruning_steps_test = [0,1,2,3,4,5,6,7]

A python function taking the steps list and the endpoints (spectrum) list yields a features vector :

Supposing now the the skeleton size is 25, let's normalise the pruning steps as follow:def EPSpectrumToFeatures(steps, spectrum): ''' eptest = [4,3,3,1,1,1,1,0] pruntest = [0,1,2,3,4,5,6,7] the returned vec:[7,6,-1,2,0] which means: 0 enpoints -> 7 prunings necessary 1 endpoint -> 6 prunings 4 endpoints-> 0 pruning (initial skeleton size) ''' values = set(spectrum) feat_vect = [-1]*(len(values)+1) spec = np.asarray(spectrum) for epn in values: indexmin = np.where(spec == epn)[0][-1] feat_vect[epn] = steps[indexmin] return feat_vect

` `

normed_pruning_steps_test = [100*(1-i/25.0) for i in pruntest] The endpoints spectrum is:Let's take a normalised endpoints spectrum:

`normedsteps = [100.0, 96.0, 92.0, 88.0, 84.0, 80.0, 76.0, 72.0]`

`endpoints = [4, 3, 3, 1, 1, 1, 1, 0]`

*EPSpectrumToFeatures(normedsteps, endpoints)*

`[72.0, 76.0, -1, 92.0, 100.0]`

- 0 endpoint for a normed number of prunings of 72%
- 1 ---------------------------------------------------------------------------76%
- no 2 endpoints, set normed number of prunings to -1
- 3 -------------------------------------------------------------------- 92%
- 4 ------------------------------------------------------------------ 100%

The different endpoints spectrum curves suggest that the vector could used for classifying 2D binary shapes.

Its endpoints spectrum (normalised by skeleton size or not) was calculated and a feature vector was derived and displayed (red) with the spectrum:

### A feature vector from a real shape:

Let's consider the shape of a hand:Its endpoints spectrum (normalised by skeleton size or not) was calculated and a feature vector was derived and displayed (red) with the spectrum:

For a larger number of image a python class, called

**Shape**was written. It is instantiated as follow:*shape*=

**Shape**(

*image*)

vector =

or by:*shape*.End_Points_Features(normed = True)
vector = shape.End_Points_Features(normed = False)

#### Feature vectors from 216 images :

216 images of small 2D binary images (silhouettes) [Sharvit et al.] were used to derive feature vectors. This set of images consists in 18 type of silhouettes with 12 instance of each. For example, there are 12 birds si`l`houettes:

Prior any kind of classification the 216 normed feature vectors were aligned for visual inspection:

*Bone*silhouettes seems to show some intra-class structure, while

*Brick*and

*Camel*silhouettes seems different.