用python将图像缝合在一起
我正在尝试将大约50幅图像(都是相同大小的287x287)缝合在一起。具体来说,应该有25个图像在顶部行和25个图像在底部行,并且每两个图像之间也存在一个小的距离 我在尝试过程中遇到了两个困难: 第一个问题是,一个文件夹中有25个图像的名称为用python将图像缝合在一起,python,python-imaging-library,image-stitching,Python,Python Imaging Library,Image Stitching,我正在尝试将大约50幅图像(都是相同大小的287x287)缝合在一起。具体来说,应该有25个图像在顶部行和25个图像在底部行,并且每两个图像之间也存在一个小的距离 我在尝试过程中遇到了两个困难: 第一个问题是,一个文件夹中有25个图像的名称为'prefix-70',…,'prefix-94',而另一个文件夹中有25个图像的名称为'prefix-70',…,'prefix-94'。我不知道如何在Python中使用它们而不产生冲突 第二个问题是,我编写了以下代码来读取一个文件夹的图像以形成一行,但它
'prefix-70',…,'prefix-94'
,而另一个文件夹中有25个图像的名称为'prefix-70',…,'prefix-94'
。我不知道如何在Python中使用它们而不产生冲突
第二个问题是,我编写了以下代码来读取一个文件夹的图像以形成一行,但它输出一列
#!/usr/bin/python3.0
#encoding=utf-8
import numpy as np
from PIL import Image
import glob,os
if __name__=='__main__':
#prefix=input('Input the prefix of images:')
prefix = 'prefix'
files=glob.glob(prefix+'-*')
num=len(files)
filename_lens=[len(x) for x in files] #length of the files
min_len=min(filename_lens) #minimal length of filenames
max_len=max(filename_lens) #maximal length of filenames
if min_len==max_len:#the last number of each filename has the same length
files=sorted(files) #sort the files in ascending order
else:
index=[0 for x in range(num)]
for i in range(num):
filename=files[i]
start=filename.rfind('-')+1
end=filename.rfind('.')
file_no=int(filename[start:end])
index[i]=file_no
index=sorted(index)
files=[prefix+'-'+str(x)+'.png' for x in index]
print(files[0])
baseimg=Image.open(files[0])
sz=baseimg.size
basemat=np.atleast_2d(baseimg)
for i in range(1,num):
file=files[i]
im=Image.open(file)
im=im.resize(sz,Image.ANTIALIAS)
mat=np.atleast_2d(im)
print(file)
basemat=np.append(basemat,mat,axis=0)
final_img=Image.fromarray(basemat)
final_img.save('merged.png')
我想我走错路了。。。
我怎样才能把它们缝好?感谢您的建议。安装ImageMagick,然后告诉它您的两个目录在哪里
#!/usr/bin/python3
##=========================================================
## required ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
##
## imagemagick.org/script/download.php
##
##=========================================================
## libs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import subprocess as sp
##=========================================================
## vars ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
offset = 2 ## pixel gap between images
color = '#000000' ## background color to fill gaps
dir1 = '/home/me/Pictures/topRow/'
dir2 = '/home/me/Pictures/bottomRow/'
## note: windows dirs use double backslashes
## 'C:\\Users\\me\\Pictures\\topRow\\'
##=========================================================
## script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
row1args = ['convert', '+smush', offset, '-background', color, dir1 + '*.png', 'row1.png']
row2args = ['convert', '+smush', offset, '-background', color, dir2 + '*.png', 'row2.png']
merge = ['convert', '-smush', offset, '-background', color, 'row*.png', 'merged.png']
##=========================================================
## main ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sp .call(row1args)
sp .call(row2args)
sp .call(merge)
##=========================================================
## eof ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
试试这个(在评论中解释):
要获取行而不是列,只需将轴=0更改为轴=1即可。谢谢。我如何在图像之间留出距离,以及如何像问题1中所说的那样构造两行呢?这并不是对OP所显示内容的回答。这是我在Python中所采用的方法。ImageMagick就是为了这个原因而制作的,所以使用它是有意义的。非常感谢你,作为一个初学者,我从你身上学到了很多。我还有一个问题,因为所有的图像实际上都是黑色背景和几个白点,我发现图像似乎是紧密缝合的,因为上面的代码通过黑色区域将两个图像分开。我可以用白色区域将它们分开吗?@fdafdsjflasdjlfas您可以在创建基础图像时传递一个
color
选项new\u im=image.new('RGB',(总宽度,总高度),color=(255,255))
。这就是你的意思吗?
from PIL import Image
from os import listdir, path
space_between_row = 10
new_image_path = 'result.jpg'
im_dirs = ['images/1', 'images/2']
# get sorted list of images
im_path_list = [[path.join(p, f) for f in sorted(listdir(p))] for p in im_dirs]
# open images and calculate total widths and heights
im_list = []
total_width = 0
total_height = 0
for path_list in im_path_list:
images = list(map(Image.open, path_list))
widths, heights = zip(*(i.size for i in images))
total_width = max(total_width, sum(widths))
total_height += max(heights)
im_list.append(images)
# concat images
new_im = Image.new('RGB', (total_width, total_height))
y_offset = 0
for images in im_list:
x_offset = 0
max_height = 0
for im in images:
new_im.paste(im, (x_offset, y_offset))
x_offset += im.size[0]
max_height = max(im.size[1], max_height)
y_offset = y_offset + max_height + space_between_row
# show and save
new_im.show()
new_im.save(new_image_path)