使用numpy提取像素实现图片四等分裁剪时输出结果异常求助
问题根源
你的代码核心错误出在numpy多维数组的切片操作上:
img[xmin:xmax][ymin:ymax]的执行逻辑是:先对图像数组的0轴(对应图像高度)裁剪xmin到xmax范围,得到一个尺寸为(maxX, 原图宽度, 通道数)的中间数组,再对这个中间数组的0轴继续裁剪ymin到ymax范围,全程没有对1轴(对应图像宽度)做裁剪,才会出现半幅、窄条的错误输出。- 正确的numpy多维数组切片需要用逗号分隔不同维度的裁剪范围,写法为
img[xmin:xmax, ymin:ymax]。
另外还有几处可优化的非致命问题:
- Python语法中不需要在每行末尾加英文分号
imageio.imsave的输出文件名后缀是.png,但第三个参数指定了'jpg',格式参数和输出后缀不匹配- 不需要提前初始化全零的
imagesList数组,可以直接赋值裁剪后的结果
修正后代码
import numpy as np from PIL import Image import imageio import math filename = "preview_redd_it-8qwf04k4uc181.jpg" im_in = Image.open(filename) img = np.asarray(im_in) filename = filename.removesuffix(".jpg") print(img.shape) shape = img.shape maxX = math.floor(shape[0]/2) maxY = math.floor(shape[1]/2) for i in range(0,4): xmin = (i%2)*maxX xmax = xmin + maxX ymin = int(i/2)*maxY ymax = ymin + maxY print(f"{xmin}:{xmax}") print(f"{ymin}:{ymax}\n") # 修正多维切片写法 crop_img = img[xmin:xmax, ymin:ymax] # 保存格式和后缀统一为png imageio.imsave(f"{filename}{i}.png", crop_img)
内容的提问来源于stack exchange,提问作者safir
相关产品推荐
相关产品推荐

