def _extract_feature(X, feature):
"""Performs feature extraction
:param X: data (rows=images, cols=pixels)
:param feature: which feature to extract
- None: no feature is extracted
- "gray": grayscale features
- "rgb": RGB features
- "hsv": HSV features
- "surf": SURF features
- "hog": HOG features
:returns: X (rows=samples, cols=features)
"""
# transform color space
if feature == 'gray' or feature == 'surf':
X = [cv2.cvtColor(x, cv2.COLOR_BGR2GRAY) for x in X]
elif feature == 'hsv':
X = [cv2.cvtColor(x, cv2.COLOR_BGR2HSV) for x in X]
# operate on smaller image
small_size = (32, 32)
X = [cv2.resize(x, small_size) for x in X]
# extract features
if feature == 'surf':
surf = cv2.SURF(400)
surf.upright = True
surf.extended = True
num_surf_features = 36
# create dense grid of keypoints
dense = cv2.FeatureDetector_create("Dense")
kp = dense.detect(np.zeros(small_size).astype(np.uint8))
# compute keypoints and descriptors
kp_des = [surf.compute(x, kp) for x in X]
# the second element is descriptor: choose first num_surf_features
# elements
X = [d[1][:num_surf_features, :] for d in kp_des]
elif feature == 'hog':
# histogram of gradients
block_size = (small_size[0] / 2, small_size[1] / 2)
block_stride = (small_size[0] / 4, small_size[1] / 4)
cell_size = block_stride
num_bins = 9
hog = cv2.HOGDescriptor(small_size, block_size, block_stride,
cell_size, num_bins)
X = [hog.compute(x) for x in X]
elif feature is not None:
# normalize all intensities to be between 0 and 1
X = np.array(X).astype(np.float32) / 255
# subtract mean
X = [x - np.mean(x) for x in X]
X = [x.flatten() for x in X]
return X
评论列表
文章目录