如何将一张图片水平分割成大小相等的几个部分?

3

我正在尝试将这个输入图像水平地分成三个/四个大小相等的部分,但是我没有得到期望的输出。我不知道我做错了什么。 以下是我编写的用于拆分图像的代码:

import os.path
import numpy as np
from PIL import image

input_1 = "/home/task-1/split_operation/111.jpg"
outputPath = "/home/task-1/split_operation/"
im = Image.open(input_1)
x_width, y_height = im.size
split = np.int(x_width / 3)
outputFileFormat = "{0}-{1}.jpg"
baseName = "cropped_1"
for i in range(0, x_width, split):
    x = split + i
    box = (x, 0, x + split, y_height)
    a = im.crop(box)
    a.load()
    outputName = os.path.join(outputPath, outputFileFormat.format(baseName, i + 1))
    a.save(outputName, "JPEG")

输入图像:

这是一个输入图像

我目前得到的输出图像:

可以看到,最后两张图片是黑色的。我不知道为什么会得到一张黑色的图片。

2个回答

2
你的问题是当i=0时,你的第一个xsplit了,这意味着你跳过了第一张图片。你可以看到第一张图片与原始图像边缘不对齐。此外,你将像素四舍五入以用作range函数的步长,但这会创建一个问题行为:你的图像宽度为800像素。这意味着你的split是266。这意味着最后一个i值将是798,这就是为什么第三张图片在左侧边缘有2个像素的细线的原因。
更好的方法是使用np.linspace生成所有的“边缘”。这确保了恰好正确大小的正确数量的图片,而不必费心于range循环和width计算。只需创建edges列表并在循环中使用它即可。
...
pictures = 3
edges = np.linspace(0, x_width, pictures+1)
for start, end in zip(edges[:-1], edges[1:]):
    box = (start, 0, end, y_height)
    ...

剩下的部分保持不变。

使用 pictures = 3 运行将会产生以下结果:

运行 pictures = 4 将产生以下结果:

`


-1

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

让我们来看一下你的for循环的前几次迭代:

  1. i = 0; x = 300; x + split = 600
  2. i = 300; x = 300 + 300 = 600; x + split = 900 ...

如你所见,图像的一部分(0--300px)丢失了。 这可以很容易地修复:

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

你得到黑色图像的原因只是因为你试图访问不属于图像的像素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接