从尺寸不一的二维NumPy图像提取固定维度特征向量用于KNN分类
嘿,针对你这个从可变尺寸二值图(星形/五边形)提取固定维度特征做KNN分类的需求,我整理了几个实战中好用的方案,都是圈内常用的思路,你可以按需选择:
核心思路:从可变尺寸二值图中提取固定维度特征
因为你的图像尺寸不一,所以核心要找对缩放/旋转/平移不敏感,或者能通过标准化流程固定维度的特征。以下是具体方案:
方案一:形状统计特征(简单易上手,适合规则形状)
这类特征是从图像的基础属性出发,手动组合成固定维度向量,对星形和五边形这种差异明显的形状区分度足够。常用的特征包括:
- 面积:图像中前景像素(值为1)的总数
- 圆形度:衡量形状接近圆形的程度,公式为
4π×面积/(周长²),五边形会比星形更接近圆形 - 外接矩形宽高比:形状的“扁胖”程度,星形和五边形的比例会有差异
- 归一化重心:重心相对于外接矩形的位置,消除平移影响
代码实现(用skimage工具包)
import numpy as np from skimage import measure def extract_stat_features(image): # 计算面积 area = np.sum(image) # 计算周长(二值图需转成uint8类型) perimeter = measure.perimeter(image.astype(np.uint8)) # 计算圆形度(加小epsilon避免除以0) circularity = (4 * np.pi * area) / (perimeter**2 + 1e-8) # 计算外接矩形及宽高比 bbox = measure.bounding_box(image) height = bbox[3] - bbox[1] width = bbox[2] - bbox[0] aspect_ratio = width / (height + 1e-8) # 计算归一化重心 centroid = measure.centroid(image) norm_centroid_y = centroid[0] / height if height != 0 else 0.5 norm_centroid_x = centroid[1] / width if width != 0 else 0.5 # 返回固定5维特征向量 return np.array([area, circularity, aspect_ratio, norm_centroid_y, norm_centroid_x])
方案二:Hu不变矩(对缩放/旋转/平移完全免疫)
Hu矩是由图像的二阶、三阶中心矩归一化得到的7个不变量,不管图像怎么缩放、旋转、平移,这7个值都能保持稳定,完美适配你图像尺寸不一的场景,对形状的区分度非常高。
代码实现
from skimage.feature import hu_moments def extract_hu_features(image): # 计算Hu矩,返回7维向量 hu = hu_moments(image.astype(np.uint8)) # 对结果取对数,缩小数值范围,提升稳定性 return np.log(np.abs(hu)).flatten()
方案三:HOG特征+固定尺寸缩放(捕捉细节边缘)
如果想更细致地捕捉形状的边缘纹理,可以先把所有图像缩放到统一尺寸(比如64×64),再提取方向梯度直方图(HOG)特征,这样就能得到固定维度的向量。
代码实现
from skimage.transform import resize from skimage.feature import hog def extract_hog_features(image, target_size=(64,64)): # 缩放图像到固定尺寸 resized_img = resize(image, target_size, anti_aliasing=True) # 提取HOG特征,参数可根据需求调整 hog_features = hog(resized_img, orientations=9, pixels_per_cell=(8,8), cells_per_block=(2,2), visualize=False, feature_vector=True) return hog_features
注:64×64尺寸下,HOG特征维度为1764维,维度虽高,但KNN在小样本(各30张)场景下也能正常处理。
KNN分类的后续建议
- 特征归一化:不管用哪种特征,都要用
StandardScaler或MinMaxScaler做归一化——KNN是基于距离的算法,特征尺度差异大会严重影响分类结果。 - 特征组合:可以把统计特征和Hu矩结合(比如5+7=12维),进一步提升区分度。
- 调优k值:用交叉验证(比如
GridSearchCV)选择最优的k值,避免过拟合或欠拟合。
内容的提问来源于stack exchange,提问作者Visionary Zen
相关产品推荐
相关产品推荐

