skimage实现HOG报negative dimensions are not allowed错误
错误成因
触发ValueError: negative dimensions are not allowed的核心原因有两个:
channel_axis参数传值错误:你传入了布尔值True,但该参数要求输入通道维度对应的整数索引,不接受布尔值。Python中布尔类型是整型的子类,True等价于整数1,对于shape格式为(高度, 宽度, 3)的常规RGB彩色图,传入True会让skimage误将宽度维度识别为通道维度,把(高度, 3)作为空间维度计算,直接导致后续维度计算逻辑混乱。- HOG窗口参数与图片尺寸不匹配:你设置的
pixels_per_cell=(32,32)、cells_per_block=(4,4),对应单个检测块的尺寸为32*4=128像素,如果你的cr7.jpeg高度或宽度小于128像素,滑动窗口计算时会得到负的有效特征维度,直接触发报错。 - 额外代码问题:你重复导入了
io模块,开头的import io会被后续from skimage import io覆盖,虽然不是本次报错的诱因,但属于冗余代码建议删除。
修复方案
- 修正
channel_axis传值:彩色图像(通道在最后一维)传-1,灰度图像直接传None或不传该参数,禁止传入布尔值。 - 先确认输入图片的实际尺寸,调整
pixels_per_cell和cells_per_block数值,保证单块尺寸(单元格像素*每块单元格数)小于图片的高度和宽度。 - 修正后的参考代码如下:
from skimage.io import imread, imshow from skimage.feature import hog from skimage import exposure from skimage import io import matplotlib.pyplot as plt img = imread('cr7.jpeg') # 打印图片尺寸,方便适配参数 print(f"输入图片尺寸:{img.shape}") io.imshow(img) # 正确设置通道参数 is_color = True channel_axis = -1 if is_color else None # 可根据图片尺寸调整单元格和块大小,小尺寸图建议用(8,8)像素每单元格、(2,2)单元格每块 hogfv, hog_image = hog( img, orientations=9, pixels_per_cell=(16,16), cells_per_block=(2,2), visualize=True, channel_axis=channel_axis ) hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0,5)) imshow(hog_image_rescaled) plt.show()
调参提示:如果你的图片尺寸小于128像素,直接将
pixels_per_cell改为(8,8)、cells_per_block改为(2,2)即可正常运行;如果是尺寸大于128像素的大图,修正channel_axis参数后即可使用你原本的窗口配置。
内容的提问来源于stack exchange,提问作者Vivek Viradia
相关产品推荐
相关产品推荐

