Python 如何将裁剪后的图像合并回原始图像?
我有一个大小为10980x10980的图像,我使用python脚本将该图像裁剪为256x256大小。我用于裁剪的脚本是:Python 如何将裁剪后的图像合并回原始图像?,python,image,python-imaging-library,Python,Image,Python Imaging Library,我有一个大小为10980x10980的图像,我使用python脚本将该图像裁剪为256x256大小。我用于裁剪的脚本是: from PIL import Image infile = 'Amritsar_T43SDR.tif' chopsize = 256 img = Image.open(infile) width, height = img.size for x0 in range(0, width, chopsize): for y
from PIL import Image
infile = 'Amritsar_T43SDR.tif'
chopsize = 256
img = Image.open(infile)
width, height = img.size
for x0 in range(0, width, chopsize):
for y0 in range(0, height, chopsize):
box = (x0, y0,
x0+chopsize if x0+chopsize < width else width - 1,
y0+chopsize if y0+chopsize < height else height - 1)
print('%s %s' % (infile, box))
img.crop(box).save('Train.%s.x%03d.y%03d.tif' % (infile.replace('.tif',''), x0, y0))
它无法捕捉原始尺寸
或者,我们使用ImageMajik程序,并以
montage -mode concatenate -tile 43x85 Train*.tif new_amritsar.tif
结果,它合并了图像,但没有按实际顺序合并
请告诉我解决办法
问候
亚西尔
未经测试,但请尝试此操作。首先稍微更改文件命名,以适应更多的磁贴:
img.crop(box).save('Train.%s.y%05d.x%05d.tif' % (infile.replace('.tif',''), y0, x0))
现在,您的x
和y
坐标应该颠倒,以便于排序,并将零填充到5个位置,而不是3个位置
然后,您应该能够使用以下工具以正确的顺序获得文件列表:
ls Train.Amritsar_T43SDR*tif | sort -n > files.txt
然后用以下图片蒙太奇:
magick montage -geometry +0+0 -tile 43x @files.txt result.tif
或者,如果您需要等效的单衬里:
ls Train.Amritsar_T43SDR*tif | sort -n | magick montage -geometry +0+0 -tile 43x @- result.tif
关键词:Python、图像处理、重新组装、拼图、ImageMagick、蒙太奇。如果您使用的是Windows,您可能对我的其他答案有困难,因此这里有一个基于Python的答案 同样,我建议您更改文件命名,将零填充改为5位数的长度。然后,通过查看名称中包含
x00000
的文件,可以获得所有y偏移的列表,通过查看名称中包含y00000
的所有文件,可以获得所有x偏移的列表
可能是这样的:
#!/usr/bin/env python3
import re
import glob
# Generate a list of all the Y offsets by looking at all the Train*x00000*tif filenames
yoffsets = []
for f in glob.glob("Train*x00000*tif"):
# Look for a `y` followed by 5 digits
yoffsets.append(int(re.findall(r'y(\d{5})', f)[0]))
# Generate a list of all the X offsets by looking at all the Train*y00000*tif filenames
xoffsets = []
for f in glob.glob("Train*y00000*tif"):
# Look for an `x` followed by 5 digits
xoffsets.append(int(re.findall(r'x(\d{5})', f)[0]))
# Generate filenames in order
for y in sorted(yoffsets):
ypad = str(y).zfill(5)
for x in sorted(xoffsets):
xpad = str(x).zfill(5)
print(f"Train...y{ypad}.x{xpad}.tif")
现在,您可以将文件名打印到一个文件中,然后像以前一样启动ImageMagick
蒙太奇
,或者您可以创建一个大的空画布,在我的最终for
循环中一次打开一个文件,并将每个文件粘贴到正确的位置。请问您使用的是什么操作系统?我的答案解决了您的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢
#!/usr/bin/env python3
import re
import glob
# Generate a list of all the Y offsets by looking at all the Train*x00000*tif filenames
yoffsets = []
for f in glob.glob("Train*x00000*tif"):
# Look for a `y` followed by 5 digits
yoffsets.append(int(re.findall(r'y(\d{5})', f)[0]))
# Generate a list of all the X offsets by looking at all the Train*y00000*tif filenames
xoffsets = []
for f in glob.glob("Train*y00000*tif"):
# Look for an `x` followed by 5 digits
xoffsets.append(int(re.findall(r'x(\d{5})', f)[0]))
# Generate filenames in order
for y in sorted(yoffsets):
ypad = str(y).zfill(5)
for x in sorted(xoffsets):
xpad = str(x).zfill(5)
print(f"Train...y{ypad}.x{xpad}.tif")