skimage HOG提取返回空特征向量问题求助
解决skimage HOG提取空特征向量的问题
核心原因:图像尺寸与HOG默认参数不兼容
skimage.feature.hog的默认参数配置为:
cell_size=(8, 8):每个细胞单元的像素尺寸block_size=(2, 2):每个块包含的细胞单元数量- 默认无填充(
padding=(0,0))
你的正负样本均为16x16的小尺寸图像,刚好等于单个block的像素尺寸(2*8=16)。但skimage 0.19.2中HOG的块需要按cell_size(默认8px)滑动,16x16的图像无法提供足够的滑动空间,导致无法生成有效特征块,最终返回空数组。
排查与解决步骤
1. 先确认图像读取状态与尺寸
先在代码中添加检查,确保图像正确读取并确认实际尺寸:
from skimage.feature import hog import cv2 as cv img = cv.imread("<path to image>", cv.IMREAD_GRAYSCALE) # 检查图像是否读取成功 print(f"图像读取状态:{img is not None}") # 打印图像尺寸 print(f"图像尺寸:{img.shape}") if img is not None: desc = hog(img) print(f"特征向量长度:{len(desc)}") print(desc)
2. 调整HOG参数适配小尺寸图像
针对16x16的图像,可通过以下三种方式修改参数:
方式一:减小细胞单元尺寸
将cell_size改为(4,4),这样block的实际尺寸为8x8,16x16的图像可划分出多个有效块:
desc = hog(img, cell_size=(4, 4))
方式二:添加填充
通过padding参数让块可以覆盖图像边界,同时确保输出一维特征向量:
desc = hog(img, padding=(1, 1), feature_vector=True)
方式三:修改块尺寸
将block_size改为(1,1),让每个细胞单元单独作为一个块:
desc = hog(img, block_size=(1, 1))
3. 验证参数有效性
用纯白图像测试,确认调整后的参数能生成有效特征:
import numpy as np # 创建16x16纯白图像 white_img = np.ones((16,16), dtype=np.uint8)*255 desc = hog(white_img, cell_size=(4,4)) print(f"纯白图像特征长度:{len(desc)}") print(desc)
训练SVM的额外建议
- 统一所有正负样本的尺寸,避免因尺寸差异导致特征向量长度不一致
- 调整HOG参数后,确认正负样本的特征长度完全相同,否则无法用于Linear SVM训练
内容的提问来源于stack exchange,提问作者tintin98
相关产品推荐
相关产品推荐

