New in version 0.6.1: SURF is only available starting in version 0.6.1, with an important bugfix in version 0.6.2.
New in version 0.8: In version 0.8, some of the inner functions are now in mahotas.features.surf instead of mahotas.surf
Speeded-Up Robust Features (SURF) are a recent innnovation in the local features family. There are two steps to this algorithm:
The function mahotas.features.surf.surf combines the two steps:
import numpy as np
from mahotas.features import surf
f = ... # input image
spoints = surf.surf(f)
print "Nr points:", len(spoints)
Given the results, we can perform a simple clustering using, for example, milk (we could have used any other system, of course; having written milk, I am most familiar with it):
try:
import milk
# spoints includes both the detection information (such as the position
# and the scale) as well as the descriptor (i.e., what the area around
# the point looks like). We only want to use the descriptor for
# clustering. The descriptor starts at position 5:
descrs = spoints[:,5:]
# We use 5 colours just because if it was much larger, then the colours
# would look too similar in the output.
k = 5
values, _ = milk.kmeans(descrs, k)
colors = np.array([(255-52*i,25+52*i,37**i % 101) for i in xrange(k)])
except:
values = np.zeros(100)
colors = [(255,0,0)]
So we are assigning different colours to each of the possible
The helper surf.show_surf draws coloured polygons around the interest points:
f2 = surf.show_surf(f, spoints[:100], values, colors)
imshow(f2)
show()
Running the above on a photo of luispedro, the author of mahotas yields:
from __future__ import print_function
import numpy as np
import mahotas
from mahotas.features import surf
from pylab import *
from os import path
try:
luispedro_image = path.join(
path.dirname(path.abspath(__file__)),
'data',
'luispedro.jpg')
except NameError:
luispedro_image = 'data/luispedro.jpg'
f = mahotas.imread(luispedro_image, as_grey=True)
f = f.astype(np.uint8)
spoints = surf.surf(f, 4, 6, 2)
print("Nr points:", len(spoints))
try:
import milk
descrs = spoints[:,5:]
k = 5
values, _ =milk.kmeans(descrs, k)
colors = np.array([(255-52*i,25+52*i,37**i % 101) for i in range(k)])
except:
values = np.zeros(100)
colors = np.array([(255,0,0)])
f2 = surf.show_surf(f, spoints[:100], values, colors)
imshow(f2)
show()
The mahotas.features.surf module contains separate functions for all the steps in the SURF pipeline.
fi = integral(f, in_place=False, dtype=np.double):
Compute integral image
Parameters : | f : ndarray
in_place : bool, optional
dtype : dtype, optional
|
---|---|
Returns : | fi : ndarray of dtype of same shape as f
|
points = surf(f, nr_octaves=4, nr_scales=6, initial_step_size=1, threshold=0.1, max_points=1024, descriptor_only=False):
Run SURF detection and descriptor computations
Speeded-Up Robust Features (SURF) are fast local features computed at automatically determined keypoints.
Parameters : | f : ndarray
nr_octaves : integer, optional
nr_scales : integer, optional
initial_step_size : integer, optional
threshold : float, optional
max_points : integer, optional
descriptor_only : boolean, optional
|
---|---|
Returns : | points : ndarray of double, shape = (N, 6 + 64)
|