PIL:可以填充遮罩吗?
假设我有一个遮罩(一个空白的三角形 - 三角形内部是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
听起来你是在问,是否可以只用一个数值数组来填充或修改三角形的每个像素,而不去碰那些你不想填充的像素,仅仅依靠图像数据。
如果是这样的话,简单的回答是:不行。
当然,你可以创建一个优化数组,只引用那些属于三角形的像素,但为了创建这个数组,你还是得访问每个像素,所以这只有在你多次访问同一组像素时才会有好处。
PIL(Python Imaging Library)可能提供了一些帮助来进行混合处理,这样会比自己去实现要好。
另一方面,如果你知道三角形在你的图像中的尺寸和位置,你可以计算出三角形内部像素的位置。为此,你需要学习一些三角函数的知识。
如果你还不知道怎么做,我建议你还是逐个访问每个像素,这样会是一个很好的学习经历。如果以后需要提高性能,等你理解了基本概念后,路径会更清晰。
2
这行代码的意思是:把一个叫做“mask”的东西中所有值为1的地方,替换成“data”里的值。简单来说,就是找出“mask”里面等于1的部分,然后把这些部分的内容换成“data”里的内容。