如何在Python中将图像拆分为多个部分

62 投票
23 回答
225339 浏览
提问于 2025-04-16 17:22

我正在尝试用PIL把一张照片分成多个部分。

def crop(Path,input,height,width,i,k,x,y,page):
    im = Image.open(input)
    imgwidth = im.size[0]
    imgheight = im.size[1]
    for i in range(0,imgheight-height/2,height-2):
        print i
        for j in range(0,imgwidth-width/2,width-2):
            print j
            box = (j, i, j+width, i+height)
            a = im.crop(box)
            a.save(os.path.join(Path,"PNG","%s" % page,"IMG-%s.png" % k))
            k +=1

但是好像没有成功。虽然照片被分开了,但分的方式不太准确(你可以试试看)。

23 个回答

44

作为一种替代方案,我们将通过生成坐标网格来构建瓷砖,使用的是 itertools.product。我们会忽略边缘的部分瓷砖,只会在两个区间之间进行完整的组合,也就是 例如 range(0, h-h%d, d) X range(0, w-w%d, d)

这里有几个参数:filename 是图片的文件名,d 是瓷砖的大小,dir_in 是包含图片的文件夹路径,dir_out 是瓷砖输出的文件夹路径:

from PIL import Image
from itertools import product
def tile(filename, dir_in, dir_out, d):
    name, ext = os.path.splitext(filename)
    img = Image.open(os.path.join(dir_in, filename))
    w, h = img.size
    
    grid = product(range(0, h-h%d, d), range(0, w-w%d, d))
    for i, j in grid:
        box = (j, i, j+d, i+d)
        out = os.path.join(dir_out, f'{name}_{i}_{j}{ext}')
        img.crop(box).save(out)

在这里输入图片描述

51

将图片分割成 MxN 像素的小块(假设 im 是一个 numpy.ndarray):

tiles = [im[x:x+M,y:y+N] for x in range(0,im.shape[0],M) for y in range(0,im.shape[1],N)]

如果你想把图片分成四块:

M = im.shape[0]//2
N = im.shape[1]//2

tiles[0] 存放的是左上角的那一块

40

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当你输入一个数字时,程序可以根据这个数字来决定接下来要做什么。这就像你在游戏中选择不同的路径,取决于你做出的选择。

为了实现这个功能,我们通常会使用“条件语句”。条件语句就像是一个判断的工具,它会检查某个条件是否成立,然后根据结果来执行不同的代码。例如,如果你输入的数字是5,程序就会执行一段代码;如果不是5,程序可能会执行另一段代码。

这样,我们就可以让程序根据不同的情况做出不同的反应,增加了程序的灵活性和智能性。

from PIL import Image

def crop(path, input, height, width, k, page, area):
    im = Image.open(input)
    imgwidth, imgheight = im.size
    for i in range(0,imgheight,height):
        for j in range(0,imgwidth,width):
            box = (j, i, j+width, i+height)
            a = im.crop(box)
            try:
                o = a.crop(area)
                o.save(os.path.join(path,"PNG","%s" % page,"IMG-%s.png" % k))
            except:
                pass
            k +=1

撰写回答