2015-10-19 54 views
0

我一直在使用Python 3和Numpy来处理一个图像处理任务,我将小瓷砖组装成一个大的完整图像。Python-VIPS是否支持对其图像的一部分进行分配?

我应该这样做:

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是记录每个瓦片beblongs文件列表中的条目。我想知道在Python中使用VIPS可以实现类似的操作吗?

回答

1

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") 

有全部VIP运营商的搜索列表,在这里:

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/func-list.html

对于插入的文档是在这里:

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-conversion.html#vips-insert

虽然你似乎在为每一次迭代制作一个新的(巨大的)图像,事实上你的背后vips会分享ima ges并且只创建它需要的位。此外,将“顺序”提示设置为打开意味着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通道。

(其实是有破坏性的粘贴操作:

http://www.vips.ecs.soton.ac.uk/supported/current/doc/html/libvips/libvips-draw.html#vips-draw-image

它的存在对于确实需要修改图像画箱式的节目,它不是真的适合一般用)

相关问题