如何调整图像大小(高度=所有图像高度的平均值)并将它们从左到右水平合并?我正在使用Ubuntu Linux发行版。
答案 0 :(得分:1)
我尝试了libvips。它是一个流式图像处理库,因此它可以生成输出图像,而无需将所有输入图像加载到内存中。这意味着它可以在非常适中的计算机上生成非常大的图像。
#!/usr/bin/env python
import sys
import pyvips
total_height = 0.0
for filename in sys.argv[2:]:
tile = pyvips.Image.new_from_file(filename)
total_height += tile.height
average_height = total_height / len(sys.argv[2:])
image = None
for filename in sys.argv[2:]:
# "sequential" access hints that we want to stream the image
tile = pyvips.Image.new_from_file(filename, access="sequential")
tile = tile.resize(average_height / tile.height)
image = tile if not image else image.join(tile, "horizontal")
image.write_to_file(sys.argv[1])
我尝试了一组27张测试jpg图像:
$ time ../avgmerge.py x.tif tiles/*.jpg
loading tiles/ak01.jpg ...
...
loading tiles/curiossmall.jpg ...
writing x.tif ...
real 0m2.742s
user 0m4.800s
sys 0m0.200s
$ vipsheader x.tif
x.tif: 34954x961 uchar, 3 bands, srgb, tiffload
所以使用这个数据集,它在我的普通笔记本电脑上以2.7秒制作了35,000 x 960像素的图像。
答案 1 :(得分:0)
这是Python中的imergh.py
脚本,就是这样做的。 Imagemagick是必需的。
请注意,在运行脚本之前,您需要cd
进入包含图像的目录。适合查看大图像的一些图像查看器是Viewnior,Nomacs和Gwenview。该脚本将生成一些tmpfXXXX.png
图像和一个名为houtputh.png
的文件,并带有最终结果。
#!/usr/bin/python
import os
f = os.popen('/bin/ls -1')
fil = f.read()
arfils = fil.split("\n")
arfils.pop()
num = 0
tot = 0
for snc in arfils:
f = os.popen( "/usr/bin/identify -ping -format '%w %h' " + '\"' + snc + '\"' )
rslt = f.read()
woh = rslt.split(" ")
# 0 for width and 1 for height
intvl = int(woh[1])
tot = tot + intvl
num = num + 1
avg = tot // num
#resize images
num = 1
allfil = ""
for snc in arfils:
nout = "tmpf" + str(num).zfill(4) + ".png"
allfil = allfil + nout + " "
convcmd = "convert " + '\"' + snc + '\"' + " -resize x" + str(avg) + " -quality 100 "
convcmd = convcmd + '\"' + nout + '\"'
#print convcmd
f = os.popen(convcmd)
num = num + 1
mrg = "convert +append " + allfil + "houtputh.png"
f = os.popen(mrg)
答案 2 :(得分:0)
只使用ImageMagick和bash shell脚本(没有Python)的组合,你可以这样做:
cd path_to/images_folder
list=$(ls *)
i=0
for img in $list; do
htArr[$i]=$(convert -ping $img -format "%h" info:)
i=$((i+1))
done
num=${#htArr[*]}
total_ht=0
for ((i=0; i<num; i++)); do
ht=${htArr[$i]}
total_ht=$((total_ht+ht))
done
average_ht=$(convert xc: -format "%[fx:round($total_ht/$num)]" info:)
convert $list -resize x$average_ht +append result.jpg
填写您的path_to / images_folder并将其复制并粘贴到终端窗口中。