mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-10 11:17:17 +08:00
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
# TODO Normal sampling from image patch of size 49 x 49
|
|
# TODO Tests, example, doc
|
|
|
|
import numpy as np
|
|
from skimage.color import rgb2gray
|
|
from scipy.ndimage.filters import gaussian_filter
|
|
|
|
KERNEL_SIZE = (9, 9)
|
|
PATCH_SIZE = (49, 49)
|
|
|
|
|
|
def _remove_border_keypoints(image, keypoints, dist):
|
|
|
|
width = image.shape[0]
|
|
height = image.shape[1]
|
|
for i, j in keypoints:
|
|
if i > width - dist[0] or i < dist[0] or j < dist[1] or j > height - dist[0]:
|
|
keypoints.remove((i, j))
|
|
return keypoints
|
|
|
|
|
|
def brief(image, keypoints, descriptor_size=32, mode='uniform'):
|
|
|
|
if np.squeeze(image).ndim == 3:
|
|
image = rgb2gray(image)
|
|
|
|
keypoints = _remove_border_keypoints(image, keypoints, (PATCH_SIZE[0] / 2, PATCH_SIZE[1] / 2))
|
|
|
|
descriptor = np.zeros((len(keypoints), descriptor_size * 8), dtype=int)
|
|
|
|
image = gaussian_filter(image, 2)
|
|
|
|
if mode == 'uniform':
|
|
np.random.seed(1)
|
|
first = np.random.randint(-PATCH_SIZE / 2, (PATCH_SIZE / 2) + 1, (descriptor_size * 8, 2))
|
|
np.random.seed(2)
|
|
second = np.random.randint(-PATCH_SIZE / 2, (PATCH_SIZE / 2) + 1, (descriptor_size * 8, 2))
|
|
else:
|
|
#TODO mode='normal'
|
|
pass
|
|
|
|
for i in range(len(keypoints)):
|
|
set_1 = first + keypoints[i]
|
|
set_2 = second + keypoints[i]
|
|
|
|
for j in range(descriptor_size * 8):
|
|
if image[set_1[j, 0]][set_1[j, 1]] < image[set_2[j, 0]][set_2[j, 0]]:
|
|
descriptor[i][j] = 1
|
|
else:
|
|
descriptor[i][j] = 0
|
|
|
|
return descriptor
|
|
|
|
def hamming_distance(descriptor_1, descriptor_2):
|
|
|
|
distance = np.zeros((len(descriptor_1), len(descriptor_2)), dtype=int)
|
|
for i in range(len(descriptor_1)):
|
|
for j in range(len(descriptor_2)):
|
|
distance[i, j] = sum(np.bitwise_xor(descriptor_1[i][:], descriptor_2[j][:]))
|
|
return distance / descriptor_1.shape[1]
|