我尝试将二维列表中的特定条目设置为自身最大值和另一个值。 在以下示例中,img表示由cv2.imread读取的图像。 msk是相同维的布尔数组。我想将img的所有条目(其中msk为True)设置为value,如果value>特定条目。以下示例始终将其设置为value,即使value小于上一个条目。
img[msk] = value
类似
img[msk] = max(img[msk], value)
不起作用。
用两个for-loop解决它需要更多的时间,因为img代表一个巨大的图像(大约20000x10000 pxls)
非常感谢您的帮助!
答案 0 :(得分:0)
这是您的问题,我将假设value
是一个列表,否则它将不是二维的。
现在将“值”作为列表,您将无法比较max(img(msk),value)
,因为这两个都是列表,或者如果值不是1,那么如果是这种情况,您可能要指的是max(img[msk])
或值是列表max(img[msk]+value)
或最终如果value是一个int,max(img[msk]+[value])
。
P.S我正在做很多事情,因为您不清楚。如果我说错了,请在评论中纠正我。
编辑:根据下面的OP注释,问题类似,您无法执行数组的最大值。这是一个解决方案,不确定迭代是否更昂贵,但不使用它。
先做第一个最大值
img[msk] = value
然后创建第二个最大值,如果尚未被屏蔽并且小于该值,则基本上只有True。
msk2 = img<value
最后应用第二个msk
img[msk2] = value
这里有个例子
import numpy as np
img = np.array([[1,20],[3,4]])
msk = np.array([[True,False],[False,True]])
value = 7
img[msk]= value
# [[7,20],[3,7]]
msk2 = img < value
img[msk2] = value
#[[7,20],[7,7]]