def lbp(image, radius, points, ignore_zeros=False): ''' features = lbp(image, radius, points, ignore_zeros=False) Compute Linear Binary Patterns Parameters ---------- image : ndarray input image (2-D numpy ndarray) radius : number (integer or floating point) radius (in pixels) points : integer nr of points to consider ignore_zeros : boolean, optional whether to ignore zeros (default: False) Returns ------- features : 1-D numpy ndarray histogram of features Reference --------- Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns Ojala, T. Pietikainen, M. Maenpaa, T. LECTURE NOTES IN COMPUTER SCIENCE (Springer) 2000, ISSU 1842, pages 404-420 ''' from scipy.ndimage.interpolation import map_coordinates import mahotas._lbp from mahotas.histogram import fullhistogram if ignore_zeros: Y,X = np.nonzero(image) pixels = image[Y,X].ravel() else: Y,X = np.indices(image.shape) pixels = image.ravel() angles = np.linspace(0, 2*np.pi, points+1)[:-1] coordinates = np.empty((2, points, Y.size), float) for i,(dy,dx) in enumerate(zip(radius * np.sin(angles), radius * np.cos(angles))): coordinates[0][i] = Y.ravel() coordinates[1][i] = X.ravel() coordinates[0][i] += dy coordinates[1][i] += dx data = map_coordinates(image, coordinates.reshape((2,-1)), order=1).reshape((Y.size, -1)) codes = (data.T > pixels).sum(0) codes = mahotas._lbp.map(codes.astype(np.uint32), points) final = fullhistogram(codes.astype(np.uint32)) codes = np.arange(2**points, dtype=np.uint32) iters = codes.copy() codes = mahotas._lbp.map(codes.astype(np.uint32), points) pivots = (codes == iters) npivots = np.sum(pivots) compressed = final[pivots[:len(final)]] compressed = np.concatenate((compressed, [0]*(npivots - len(compressed)))) return compressed
def lbp(image, radius, points, ignore_zeros=False): """ features = lbp(image, radius, points, ignore_zeros=False) Compute Linear Binary Patterns Parameters ---------- image : ndarray input image (2-D numpy ndarray) radius : number (integer or floating point) radius (in pixels) points : integer nr of points to consider ignore_zeros : boolean, optional whether to ignore zeros (default: False) Returns ------- features : 1-D numpy ndarray histogram of features Reference --------- Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns Ojala, T. Pietikainen, M. Maenpaa, T. LECTURE NOTES IN COMPUTER SCIENCE (Springer) 2000, ISSU 1842, pages 404-420 """ from .interpolate import shift import mahotas._lbp from mahotas.histogram import fullhistogram if ignore_zeros: Y, X = np.nonzero(image) def select(im): return im[Y, X].ravel() pixels = image[Y, X].ravel() else: select = np.ravel pixels = image.ravel() image = image.astype(np.float64) angles = np.linspace(0, 2 * np.pi, points + 1)[:-1] data = [] for dy, dx in zip(np.sin(angles), np.cos(angles)): data.append(select(shift(image, [radius * dy, radius * dx], order=1))) data = np.array(data) codes = (data > pixels).astype(np.int32) codes *= 2 ** np.arange(points)[:, np.newaxis] codes = codes.sum(0) codes = mahotas._lbp.map(codes.astype(np.uint32), points) final = fullhistogram(codes.astype(np.uint32)) codes = np.arange(2 ** points, dtype=np.uint32) iters = codes.copy() codes = mahotas._lbp.map(codes.astype(np.uint32), points) pivots = codes == iters npivots = np.sum(pivots) compressed = final[pivots[: len(final)]] compressed = np.concatenate((compressed, [0] * (npivots - len(compressed)))) return compressed