def compute_dct_features(X, image_shape, no_coeff=30, method='zigzag'):
"""
compute 2D-dct features of a given image.
Type 2 DCT and finds the DCT coefficents with the largest mean normalized variance
:param X: 1 dimensional input image in 'c' format
:param image_shape: image shape
:param no_coeff: number of coefficients to extract
:param method: method to extract coefficents, zigzag, variance
:return: dct features
"""
X_dct = fft.dct(X, norm='ortho')
if method == 'zigzag':
out = np.zeros((len(X_dct), no_coeff), dtype=X_dct.dtype)
for i in xrange(len(X_dct)):
image = X_dct[i].reshape(image_shape)
out[i] = zigzag(image)[1:no_coeff + 1]
return out
elif method == 'rel_variance':
X_dct = X_dct[:, 1:]
# mean coefficient per frequency
mean_dct = np.mean(X_dct, 0)
# mean normalize
mean_norm_dct = X_dct - mean_dct
# find standard deviation for each frequency component
std_dct = np.std(mean_norm_dct, 0)
# sort by largest variance
idxs = np.argsort(std_dct)[::-1][:no_coeff]
# return DCT coefficients with the largest variance
return X_dct[:, idxs]
elif method == 'variance':
X_dct = X_dct[:, 1:]
# find standard deviation for each frequency component
std_dct = np.std(X_dct, 0)
# sort by largest variance
idxs = np.argsort(std_dct)[::-1][:no_coeff]
# return DCT coefficients with the largest variance
return X_dct[:, idxs]
elif method == 'energy':
X_dct = X_dct[:, 1:]
X_sum = np.abs(X_dct)
X_sum = np.sum(X_sum, 0)
idxs = np.argsort(X_sum)[::-1][:no_coeff]
return X_dct[:, idxs]
else:
raise NotImplementedError("method not implemented, use only 'zigzag', 'variance', 'rel_variance")
评论列表
文章目录