import numpy as np from skimage.feature import corner_harris, peak_local_max def get_harris_corners(im, edge_discard=20): """ This function takes a b&w image and an optional amount to discard on the edge (default is 5 pixels), and finds all harris corners in the image. Harris corners near the edge are discarded and the coordinates of the remaining corners are returned. A 2d array (h) containing the h value of every pixel is also returned. h is the same shape as the original image, im. coords is 2 x n (ys, xs). """ assert edge_discard >= 20 # find harris corners h = corner_harris(im, method='eps', sigma=1) coords = peak_local_max(h, min_distance=1, indices=True) # discard points on edge edge = edge_discard # pixels mask = (coords[:, 0] > edge) & \ (coords[:, 0] < im.shape[0] - edge) & \ (coords[:, 1] > edge) & \ (coords[:, 1] < im.shape[1] - edge) coords = coords[mask].T return h, coords def dist2(x, c): """ dist2 Calculates squared distance between two sets of points. Description D = DIST2(X, C) takes two matrices of vectors and calculates the squared Euclidean distance between them. Both matrices must be of the same column dimension. If X has M rows and N columns, and C has L rows and N columns, then the result has M rows and L columns. The I, Jth entry is the squared distance from the Ith row of X to the Jth row of C. Adapted from code by Christopher M Bishop and Ian T Nabney. """ ndata, dimx = x.shape ncenters, dimc = c.shape assert(dimx == dimc, 'Data dimension does not match dimension of centers') return (np.ones((ncenters, 1)) * np.sum((x**2).T, axis=0)).T + \ np.ones(( ndata, 1)) * np.sum((c**2).T, axis=0) - \ 2 * np.inner(x, c)