提供带有标签的图像(像素的值对应于其标签),以及接受的标签列表,我正在尝试创建一个"掩码"如果接受像素标签,则为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问题(例如here或here等),但它们似乎都涵盖了值范围或更低/更高的情况阈值(< 10),或者要改变的图像切片是连续的。
关于如何检查"是否在可接受的值中的价值的任何建议"会很棒的。
答案 0 :(得分:3)
与此同时,我找到了一个可接受的速度解决方案来解决我自己的问题:
mask = numpy.zeros(labels.shape[:2], dtype = "uint8")
mask[numpy.in1d(labels, accepted).reshape(mask.shape)] = 255
它首先使用numpy.in1d
从labels
数组中获取布尔数组,并检查accepted
中存在哪些数组(python关键字的元素功能) “)。
因为这显然必然会返回一维数组,即使它可以应用于二维数组(它只是解析数组),所以我遵循使用reshape()
使布尔数组维度对应于mask
。
最后,我使用这个布尔数组来索引mask
所需的元素并将它们设置为所需的值。
答案 1 :(得分:0)
java Introductions