打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python-PySide:分离一个spritesheet /分离图像成连续的颜色区域

我正在开发一个程序,在该程序中我需要分离精灵表,或者换句话说,将图像分离成连续的颜色区域.

我以前从未做过任何图像处理,所以我想知道如何处理.测试像素颜色后该怎么办?确定每个子画面带哪个像素的最佳方法是什么?

所有输入图像均具有统一的背景,并且与背景不同的Alpha通道被视为颜色.输出图像的顺序需要左右,上下.我的项目是用PySide编写的,因此我也希望将其用于此任务,但是如果需要,我可以导入更多的库.

感谢您的答复!

附言:
我不确定PySide标签是否合适,因为我正在使用PySide,但问题不涉及它的GUI方面.如果mod认为它不属于该对象,请随时将其删除.

例如,我有一个如下所示的Spritesheet:

我想将其分为以下几类:

解决方法:

这听起来像应该在处理sprite的任何事物中实现,但是在这里我们将实现自己的sprite-spliter.

我们这里需要的第一件事是提取单个对象.在这种情况下,仅需确定像素是否为背景.如果我们假设原点是背景像素,则可以完成以下操作:

from PIL import Imagedef sprite_mask(img, bg_point=(0, 0)):    width, height = img.size    im = img.load()    bg = im[bg_point]    mask_img = Image.new('L', img.size)    mask = mask_img.load()    for x in xrange(width):        for y in xrange(height):            if im[x, y] != bg:                mask[x, y] = 255    return mask_img, bg

如果您保存上面创建的遮罩图像并将其打开,这就是您要看到的图像(我在空窗口内添加了一个矩形):

在上面的图像中,如果我们要加入其他内部的精灵(例如添加的矩形,请参见上图),接下来需要填充它的孔.这是另一条简单的规则:如果无法从[0,0]处的点到达某个点,则它是一个孔,必须将其填充.然后剩下的就是将每个精灵分离成单独的图像.这是通过连接的组件标签完成的.对于每个组件,我们得到其轴对齐的边界框以定义零件的尺寸,然后从原始图像中复制属于给定组件的点.为了简短起见,以下代码对这些任务使用scipy:

import sysimport numpyfrom scipy.ndimage import label, morphologydef split_sprite(img, mask, bg, join_interior=True, basename='sprite_%d.png'):    im = img.load()    m = numpy.array(mask, dtype=numpy.uint8)    if join_interior:        m = morphology.binary_fill_holes(m)    lbl, ncc = label(m, numpy.ones((3, 3)))    for i in xrange(1, ncc   1):        px, py = numpy.nonzero(lbl == i)        xmin, xmax, ymin, ymax = px.min(), px.max(), py.min(), py.max()        sprite = Image.new(img.mode, (ymax - ymin   1, xmax - xmin   1), bg)        sp = sprite.load()        for x, y in zip(px, py):            x, y = int(x), int(y)            sp[y - int(ymin), x - int(xmin)] = im[y, x]        name = basename % i        sprite.save(name)        print "Wrote %s" % namesprite = Image.open(sys.argv[1])mask, bg = sprite_mask(sprite)split_sprite(sprite, mask, bg)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门
图像上的 OpenCV 算术运算
opencv中图像叠加/图像融合/按位操作的实现
老外讲解什么是直方图以及如何用opencv绘制直方图(译文)
【H5小游戏】利用pixi.js重写了赛车小游戏
Python实现PS滤镜的旋转模糊功能示例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服