当前位置: 代码迷 >> python >> Python-VIPS是否支持分配给部分图像?
  详细解决方案

Python-VIPS是否支持分配给部分图像?

热度:67   发布时间:2023-06-13 14:18:16.0

我一直在使用Python 3和Numpy来处理图像处理任务,在此过程中,我将小图块组装成一个完整的大图像。

我会这样做:

canvas = np.zeros((max_y + tilesize_y, max_x + tilesize_x, 3), dtype='uint8')

其中max_xmax_y是单个图像图块的最大起始坐标。 然后我将图像粘贴到这个大画布上,如下所示:

canvas[jj['YStart']: jj['YStart'] + tilesize_y, jj['XStart']: jj['XStart'] + tilesize_x] = temp_img

其中jj是文件列表的条目,它记录每个图块的开头位置。 我想知道是否可以使用Python在VIPS中实现类似的操作?

VIPS没有破坏性的操作:您只能构建新映像,不能修改现有映像。 这个限制就是为什么vips可以执行自动并行化和操作缓存之类的事情的原因。

在幕后,它具有一些额外的设备,可以使这种效率不如听起来的低。 您可以这样解决您的问题:

#!/usr/bin/python

import sys
import random

from gi.repository import Vips

# make vips leaktest itself .. this also reports a memory high-water mark
# you'll get a small speedup if you comment this out
Vips.leak_set(True)

composite = Vips.Image.black(10000, 10000)

for filename in sys.argv[1:]:
    tile = Vips.Image.new_from_file(filename, access = Vips.Access.SEQUENTIAL)
    x = random.randint(0, 10000)
    y = random.randint(0, 10000)
    composite = composite.insert(tile, x, y)

composite.write_to_file("output.tif")

这里是所有vips运算符的可搜索列表:

插入文档在这里:

尽管您似乎为每次迭代都制作了一个新的(巨大的)映像,但实际上,在您的背后vip后面将共享这些映像,并且仅创建所需的位。 另外,在打开时设置“顺序”提示意味着vips可以在写入最终tiff时流式传输子图像。

像这样运行:

$ time ./insert.py ~/pics/k*.jpg 
memory: high-water mark 53.81 MB
real    0m1.913s
user    0m0.939s
sys 0m0.266s
$ ls ~/pics/k*.jpg | wc
       8       8     278

粘贴8张大jpg图像。 报告的内存使用是用于像素缓冲区的,不包括所有内存。 如果尝试混合粘贴RGB和RGBA图像,此脚本将中断,您需要添加一些内容来处理alpha通道。

(实际上有一个破坏性的粘贴操作:

它确实需要修改图像的绘画盒风格的程序,不适合一般使用)