使用photomosaic库生成图片马赛克时触发TypeError的原因及解决方法咨询
photomosaic库生成图片马赛克时触发TypeError的原因及解决方法咨询
看起来你遇到的这个TypeError是因为图片的维度/通道数不兼容,或者尺寸计算后出现了非整数的裁剪索引导致的。我来帮你一步步分析和解决:
错误原因分析
从报错栈可以看到,问题出在rescale_commensurate函数调用crop_to_fit时,使用了非整数的切片索引。这通常由以下几种情况导致:
- 原始图片通道数不兼容:你输入的
r.jpg可能是单通道灰度图(2D数组)或四通道RGBA图,而photomosaic默认按RGB三通道(3D数组,shape为(H, W, 3))处理,维度不匹配会导致后续尺寸计算出错。 - 图片尺寸与网格尺寸不匹配:原始图片的宽/高和你指定的
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
相关产品推荐
相关产品推荐

