如何将图像水平分割为相等的部分?

2024-04-27 04:21:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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")

输入图像:

Itś an input image

我当前获得的输出图像:

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


Tags: path图像importhometaskinputosnp
2条回答

我假设图像的宽度是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)
    ...

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

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

更好的方法是使用^{}生成所有“边”。这确保了图片的正确数量和正确的大小,而不必费心于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运行将产生:

`

相关问题 更多 >