You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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覆盖,虽然不是本次报错的诱因,但属于冗余代码建议删除。
修复方案
  1. 修正channel_axis传值:彩色图像(通道在最后一维)传-1,灰度图像直接传None或不传该参数,禁止传入布尔值。
  2. 先确认输入图片的实际尺寸,调整pixels_per_cell和cells_per_block数值,保证单块尺寸(单元格像素*每块单元格数)小于图片的高度和宽度。
  3. 修正后的参考代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:36:56