特征工程是Python图像处理中决定模型效果上限的关键环节,涵盖基础预处理、手工特征提取、深度特征提取及特征组合与选择四大步骤。

在Python图像处理项目中,特征工程不是“把图片喂给模型就完事”,而是决定模型效果上限的关键环节。核心思路是:从原始像素中提取稳定、可区分、对任务有用的表达——可能是边缘、纹理、颜色分布,也可能是深度网络生成的高维嵌入。
一、基础预处理:让图像“规整又干净”
这步看似简单,却是后续所有特征可靠的前提。
-
统一尺寸与格式:用PIL或OpenCV将所有图像resize到固定分辨率(如224×224),转为RGB三通道;灰度图需显式扩展维度(如
cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)) - 归一化像素值:除以255.0转为[0,1]区间;若使用预训练模型(如ResNet),则按其要求做标准化(例如ImageNet均值[0.485, 0.456, 0.406]和标准差[0.229, 0.224, 0.225])
- 基础去噪与增强(可选):对低质量图像,可用高斯模糊降噪;训练阶段可加入随机水平翻转、小角度旋转、亮度微调等轻量增强,提升泛化性
二、手工特征提取:小数据、可解释场景的利器
当样本量有限或需要明确物理意义时,传统特征仍很实用。
- 颜色特征:计算HSV空间的色调(H)直方图、饱和度均值、明度方差;或用K-Means聚类提取主色(如取前3个聚类中心)
- 纹理特征:用skimage.feature.greycomatrix + greycoprops计算灰度共生矩阵(GLCM)的对比度、相关性、能量、同质性
-
形状与边缘特征:Canny检测边缘后统计边缘密度;或用HOG(方向梯度直方图)提取局部形状模式(
skimage.feature.hog)
三、深度特征提取:主流方案,省力高效
直接复用预训练CNN的中间层输出,是当前最常用、效果最好的方式。
立即学习“Python免费学习笔记(深入)”;
-
冻结主干网络:加载torchvision.models.resnet18(pretrained=True),设
model.eval()并禁用梯度(requires_grad=False) - 抽取指定层特征:去掉最后全连接层,用forward获取倒数第二层(如resnet18的AdaptiveAvgPool2d输出)得到512维向量;也可取中间层(如layer3输出)获得空间特征图
- 特征后处理:对提取的向量做L2归一化(提升余弦相似度稳定性);高维特征可配合PCA降至64–128维,加快下游训练
四、特征组合与选择:避免冗余,聚焦关键信息
不是特征越多越好,尤其多源特征混合时更需精简。
- 拼接与对齐:将手工特征(如128维HOG+32维颜色直方图)与深度特征(如512维ResNet输出)横向拼接,注意先各自归一化再concat
- 筛选有效特征:用SelectKBest(配合chi2或f_classif)按分类任务打分选Top-K;或用树模型(如RandomForest)输出feature_importances_排序
- 警惕过拟合信号:若验证集效果明显差于训练集,且特征维度远高于样本数,优先降维或删减手工特征
基本上就这些。特征工程没有银弹,关键是根据数据规模、任务类型(分类/检测/检索)、算力条件做取舍:小数据重手工+统计,大数据靠深度特征,混合场景重组合逻辑和降维。动手时先跑通baseline,再逐项替换特征模块看指标变化,比盲目堆砌更有效。










