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

Python计算多通道图像SSIM报win_size exceeds image extent错误

错误产生原因

你传入ssim函数的图像数组是shape为(1, 128, 128, 3)的4维张量,最前面多了一个长度为1的batch维度,不符合scikit-image中SSIM计算的输入要求:该函数仅支持传入2维(单通道灰度图)或3维(多通道彩色图)数组,默认将输入的前两个维度识别为图像的高、宽来做滑动窗口计算。
SSIM默认的滑动窗口边长win_size为7,你传入的数组第一个维度长度仅为1,小于窗口边长,就会抛出win_size exceeds image extent的异常。你已经设置的multichannel=True参数仅会告知函数最后一个维度是颜色通道,不会自动跳过/处理最前面的batch维度,因此无法解决这个报错。

修复方案
  • 先对两个输入数组做维度压缩,移除长度为1的batch维度,将数组shape从(1, 128, 128, 3)转为(128, 128, 3)的标准3维彩色图格式,直接使用numpy的squeeze方法即可完成该操作。
  • 如果你使用的是0.19及以上版本的scikit-image,建议将已弃用的multichannel参数替换为channel_axis=-1,明确指定最后一个维度为通道轴,避免出现参数弃用警告。

修复后的可运行代码如下:

from skimage.metrics import structural_similarity as ssim
import numpy as np

# 压缩移除长度为1的batch维度
tar_image = np.squeeze(tar_image)
gen_image = np.squeeze(gen_image)

# 验证维度是否符合要求
print(tar_image.shape)
print(gen_image.shape)

ssim_skimg = ssim(
    tar_image,
    gen_image,
    data_range=gen_image.max() - gen_image.min(),
    channel_axis=-1  # 若使用旧版本scikit-image,可替换为 multichannel=True
)

print("SSIM: based on scikit-image = ", ssim_skimg)

内容的提问来源于stack exchange,提问作者Saransh Gautam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:24:19