Python 如何将图像水平分割为大小相等的片段?

Python 如何将图像水平分割为大小相等的片段?,python,python-3.x,python-imaging-library,Python,Python 3.x,Python Imaging Library,我试图将这个输入图像水平分割成三/四个大小相等的片段,但没有得到所需的输出。我不知道我做错了什么。 下面是我为拆分它而编写的代码: 导入操作系统路径 将numpy作为np导入 从PIL导入图像 输入_1=“/home/task-1/split_operation/111.jpg” outputPath=“/home/task-1/split\u operation/” im=图像。打开(输入_1) x_宽度,y_高度=im尺寸 拆分=np.int(x_宽度/3) outputFileFormat

我试图将这个输入图像水平分割成三/四个大小相等的片段,但没有得到所需的输出。我不知道我做错了什么。 下面是我为拆分它而编写的代码:

导入操作系统路径
将numpy作为np导入
从PIL导入图像
输入_1=“/home/task-1/split_operation/111.jpg”
outputPath=“/home/task-1/split\u operation/”
im=图像。打开(输入_1)
x_宽度,y_高度=im尺寸
拆分=np.int(x_宽度/3)
outputFileFormat=“{0}-{1}.jpg”
baseName=“裁剪的_1”
对于范围内的i(0,x_宽度,分割):
x=分割+i
框=(x,0,x+分割,y_高度)
a=即时裁剪(框)
a、 加载()
outputName=os.path.join(outputPath,outputFileFormat.format(baseName,i+1))
a、 保存(outputName,“JPEG”)
输入图像:

我当前获得的输出图像:


正如您所看到的,最后两幅图像是黑色的。我不知道为什么会得到黑色图像。

我假设图像的宽度为900px。 然后
split=300

让我们看看
for
循环的前几次迭代:

  • i=0;x=300;x+分割=600
  • i=300;x=300+300=600;x+分割=900
  • 如您所见,缺少部分图像(0--300px)。 它可以很容易地修复:

    for i in range(0, x_width, split):
        box = (i, 0, i + split, y_height)
        ...
    

    您获取黑色图像的原因只是因为您试图访问不属于图像的像素。

    您的问题是,当
    i=0
    您的第一个
    x
    split
    时,意味着您跳过了第一个图像。实际上,您可以看到第一个图像与原始图像的边缘不对齐。此外,您正在舍入像素以用作
    范围
    函数的步骤,但这会产生问题行为:图像的宽度为
    800
    像素。这意味着您的
    拆分
    266
    。这意味着最后一个
    i
    值将是
    798
    ,这就是为什么第三个图像在左边缘有一条2像素的细线

    更好的方法是使用生成所有“边”。这确保了图片的正确数量和正确大小,而不必费心于
    范围
    循环和
    宽度
    计算。只需创建
    列表并在循环中使用它,如下所示:

    。。。
    图片=3
    边=np.linspace(0,x_宽度,图片+1)
    对于开始,以zip结尾(边[:-1],边[1:]):
    框=(开始、0、结束、y_高度)
    ...
    
    其余的保持不变


    使用
    pictures=3运行此操作将产生:

    使用
    pictures=4运行将产生:


    `

    谢谢你的回答,它解决了我的问题。因此,问题与一轮像素和跳过第一张图像有关。