Python图像分割报错not enough values to unpack解决方法
Felzenszwalb图像分割维度解包报错修复
问题复现
运行基于Felzenszwalb算法的图分割代码时触发ValueError: not enough values to unpack (expected 3, got 2)异常,涉及代码如下:
import numpy as np from glob import glob from PIL import Image from matplotlib import pyplot as plt from felzenszwalb_segmentation import segment image_files = glob('/content/IMG-0020-00144.png') len(image_files) image = np.array(Image.open(image_files[0])) segmented_image = segment(image, 0.2, 400, 50) fig = plt.figure(figsize=(12, 12)) a = fig.add_subplot(1, 2, 1) plt.imshow(image) a = fig.add_subplot(1, 2, 2) plt.imshow(segmented_image.astype(np.uint8)) plt.show()
报错栈定位到第三方库内部逻辑第25行:
def segment(in_image, sigma, k, min_size): height, width, band = in_image.shape # 报错触发位置 smooth_red_band = smoothen(in_image[:, :, 0], sigma) smooth_green_band = smoothen(in_image[:, :, 1], sigma)
报错根因
segment函数默认输入为3通道RGB图像,要求输入numpy数组的shape为(高度, 宽度, 通道数)共3个维度。当前读取的图像实际为单通道灰度图(或带透明通道的RGBA等非3通道格式),转成numpy数组后shape只有(高度, 宽度)2个维度,解包时无法获取第三个通道数参数,因此抛出异常。
修复方案
读取图像时统一调用PIL的convert('RGB')方法转换为三通道格式即可,无论原图是灰度图、RGBA带透明通道图,都能满足函数输入要求:
- 单通道灰度图:会将灰度值复制到R/G/B三个通道,生成符合要求的3通道数组
- 4通道RGBA图:会自动移除透明通道,保留有效颜色信息
仅需修改图像读取行的代码:
# 原代码 # image = np.array(Image.open(image_files[0])) # 修改后 image = np.array(Image.open(image_files[0]).convert('RGB'))
修改后可在调用segment前执行print(image.shape)验证维度,正常会输出长度为3的元组,格式为(图像高度, 图像宽度, 3)。
修复后完整可运行代码:
import numpy as np from glob import glob from PIL import Image from matplotlib import pyplot as plt from felzenszwalb_segmentation import segment image_files = glob('/content/IMG-0020-00144.png') image = np.array(Image.open(image_files[0]).convert('RGB')) segmented_image = segment(image, 0.2, 400, 50) fig = plt.figure(figsize=(12, 12)) a = fig.add_subplot(1, 2, 1) plt.imshow(image) a = fig.add_subplot(1, 2, 2) plt.imshow(segmented_image.astype(np.uint8)) plt.show()
内容的提问来源于stack exchange,提问作者Sugandha Singh
相关产品推荐
相关产品推荐

