PIL:可以填一个面具吗?

时间:2011-02-22 19:36:54

标签: python image python-imaging-library

假设我有一个蒙版(一个空白的三角形 - 三角形中的1/255 /等,其他地方为0)并且我有想要放置在该三角形中的纹理,但纹理是顺序的而不是被格式化为图像格式。例如,如果包含三角形/蒙版的框是100 x 100,但三角形本身只有2500像素,我只有2500像素的信息而不是实际框。

所以,我可以手动填充三角形,一次做每行或每列,但我想知道是否有一种方法可以做到这一点。

以下是我使用的代码:

def fill_mask(mask, data): #mask and data are ndarrays
    mask = np.copy(mask).T
    k = 0
    for i in xrange(len(mask)):
        for j in xrange(len(mask[i])):
            if mask[i][j] == 1:
                mask[i][j] = data[k]
                k += 1
    return mask.T

那个水平填充(逐行)。要垂直填充,请删除第一行和最后一行中的.T。尽管我很糟糕,但它可能会变得更短,所以我会保持原样。对它的任何改进也是值得赞赏的。

2 个答案:

答案 0 :(得分:2)

mask[mask==1] = data

答案 1 :(得分:0)

听起来你问是否可以使用值数组填充/修改三角形的每个像素,而不必访问仅使用图像数据不想填充的像素。

如果是这样,那么简短的回答是否定的。

当然可以创建一些仅引用那些作为三角形一部分的像素的优化数组,但是为了创建该数组,你必须访问每个像素,所以只有节省才能节省你必须多次访问同一套。

PIL可能会提供一些辅助工具来进行可能优化的混合,这比尝试自己动手更好。

另一方面,如果您知道蒙版中三角形的尺寸和位置,则可以计算三角形内像素的位置。为此,你需要研究你的三角学。

如果你不知道如何做到这一点,我会说坚持访问每个像素,这将是一个很好的学习经验。如果您以后需要提高性能,一旦理解了基本概念,路径就会更清晰。