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
相关产品推荐
相关产品推荐

