如何在Python中将图像拆分为多个部分
我正在尝试用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