Python 如何将裁剪后的图像合并回原始图像?

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

我有一个大小为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 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")