Python从一组值中屏蔽图像像素

时间:2017-03-29 15:51:18

标签: python image performance numpy vectorization

提供带有标签的图像(像素的值对应于其标签),以及接受的标签列表,我正在尝试创建一个"掩码"如果接受像素标签,则为255值的图片,否则为0

我知道这是一个缓慢的方法,因为它以python速度迭代图像(但它很好地证明了这个想法):

mask = numpy.zeros(labels.shape[:2], dtype = "uint8")

for i in xrange(mask.shape[0]):
    for j in xrange(mask.shape[1]):
        if labels[i][j] in accepted:
            mask[i][j] = 255

我知道使用python切片和屏蔽要快得多,但我不知道如何编写复杂的条件。当我逐个屏蔽像素时,我仍然会获得极大的加速,如下所示:

for value in accepted:
    mask[labels == value] = 255

我可以以某种方式做一个单行做我想要的吗?我的python知识是生锈的(读:过去几年几乎没有python),所以当我尝试使用我发现的一些例子来编写这个时,这是我得到的最接近的:

mask[(labels in accepted).all()] = 255

在这种情况下,我收到以下错误:ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我已经查看了类似的SO问题(例如herehere等),但它们似乎都涵盖了值范围或更低/更高的情况阈值(< 10),或者要改变的图像切片是连续的。

关于如何检查"是否在可接受的值中的价值的任何建议"会很棒的。

2 个答案:

答案 0 :(得分:3)

与此同时,我找到了一个可接受的速度解决方案来解决我自己的问题:

mask = numpy.zeros(labels.shape[:2], dtype = "uint8")
mask[numpy.in1d(labels, accepted).reshape(mask.shape)] = 255

它首先使用numpy.in1dlabels数组中获取布尔数组,并检查accepted中存在哪些数组(python关键字的元素功能) “)。

因为这显然必然会返回一维数组,即使它可以应用于二维数组(它只是解析数组),所以我遵循使用reshape()使布尔数组维度对应于mask

最后,我使用这个布尔数组来索引mask所需的元素并将它们设置为所需的值。

答案 1 :(得分:0)

java Introductions