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

使用photomosaic库生成图片马赛克时触发TypeError的原因及解决方法咨询

photomosaic库生成图片马赛克时触发TypeError的原因及解决方法咨询

看起来你遇到的这个TypeError是因为图片的维度/通道数不兼容,或者尺寸计算后出现了非整数的裁剪索引导致的。我来帮你一步步分析和解决:

错误原因分析

从报错栈可以看到,问题出在rescale_commensurate函数调用crop_to_fit时,使用了非整数的切片索引。这通常由以下几种情况导致:

  1. 原始图片通道数不兼容:你输入的r.jpg可能是单通道灰度图(2D数组)或四通道RGBA图,而photomosaic默认按RGB三通道(3D数组,shape为(H, W, 3))处理,维度不匹配会导致后续尺寸计算出错。
  2. 图片尺寸与网格尺寸不匹配:原始图片的宽/高和你指定的mos_size计算后,无法得到整数倍的目标尺寸,导致裁剪时出现浮点数索引。

具体解决方法

1. 统一图片通道为RGB三通道

首先处理你的原始图片,确保它是RGB格式,这是最常见的解决方法:

import sys
import numpy as np
import photomosaic as phmos
from skimage import io

image = io.imread("r.jpg")

# 处理单通道灰度图,转为RGB三通道
if image.ndim == 2:
    image = np.stack((image,) * 3, axis=-1)
# 处理四通道RGBA图,转为RGB(丢弃透明通道)
elif image.ndim == 3 and image.shape[2] == 4:
    image = image[..., :3]

# 获取马赛克网格尺寸
mos_size = (int(sys.argv[1]), int(sys.argv[2]))
# 非命令行使用可替换为 mos_size = (100, 100)

# 生成方形素材并创建图片池
phmos.rainbow_of_squares('crks/')
square_pool = phmos.make_pool('crks/*.jpg')

# 创建马赛克时显式指定depth为3(对应RGB通道数)
mosaic = phmos.basic_mosaic(image, square_pool, mos_size, depth=3)
io.imsave('mosaic_op.png', mosaic)

2. 确保图片尺寸与网格尺寸匹配(可选)

如果上述修改后仍报错,可能是原始图片尺寸和mos_size的组合导致无法生成整数倍的目标尺寸。你可以先将原始图片缩放到刚好是mos_size整数倍的尺寸:

from skimage.transform import rescale

# 假设你的方形素材是64x64像素(可根据实际素材尺寸调整)
tile_size = 64
target_height = mos_size[1] * tile_size
target_width = mos_size[0] * tile_size

# 计算缩放因子,保持图片原始比例
scale_factor = min(target_width / image.shape[1], target_height / image.shape[0])
image = rescale(image, scale_factor, anti_aliasing=True, channel_axis=-1)

# 裁剪到刚好匹配目标尺寸
image = image[:target_height, :target_width, :]

把这段代码插在处理通道之后、创建图片池之前即可。

3. 检查素材池中的图片

另外,确保crks/目录下的所有图片都是RGB格式,如果有灰度图或RGBA图,也可能干扰计算。可以用类似处理原始图片的方式统一素材的通道数,或者在生成rainbow_of_squares后检查每个图片的格式。

备注:内容来源于stack exchange,提问作者Kovy Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:10:28