如何在2d numpyarray中用1替换小于或等于0的值?

时间:2015-09-01 08:20:21

标签: python numpy image-processing

我需要采用两个图像numpyarray的比率,不幸的是,数据有一堆负值和零点散落。

我找到了一种优雅的方法,可以从numpyarray中移除值pixels = pixels[pixels>0](非常优雅),但遗憾的是,它并没有替换值。

我还尝试使用while循环,找到当前最小值和当前最小索引,将每个分配给1直到没有值< = 0,但它没有工作。

while(np.amin(pixels)<= 0):
     print "found low value of ", np.amin(evenpixels), "at", np.unravel_index(np.argmin(evenpixels), im_sz), "setting to 1"
     pixels[np.unravel_index(np.argmin(pixels), im_sz)] = 1 

我在这个while循环中得到了一些奇怪的行为,并且在尝试将最终的低值更改为1之后永远无法退出循环:它在(0,0)处找到0并且卡在这里。我无法理解这一点,我想知道它是否是一个无关的错误。请注意,我的数据形状为(2160, 2560)

3 个答案:

答案 0 :(得分:2)

如果像素的最小值可以是1(正整数),那么一个简单的修复是使用np.clip,例如:

pixels = np.clip(pixels, min, np.inf)

在这种情况下min=1

答案 1 :(得分:1)

您永远不会在循环中更改pixel的值,这就是您遇到困难的原因。但实际上你不需要这个循环,你可以使用numpy的内置布尔索引。

您可以通过以下方式指定值低于阈值的替换值:

t = np.array([[0, 255], [-1, 128]]) # dummy (2, 2) image example
threshold = 0
substitute = 1
t[t <= threshold] = substitute
print t

将输出

array([[  1, 255],
       [  1, 128]])

编辑:如果您不想修改数组,但创建一个新数组,则可以执行new_array = np.maximum(1, t)(我假设您的值是离散的,即0到1之间没有值)。

答案 2 :(得分:1)

这是numpy.where密钥用法

np.where(pixels > 0,pixels,<ret value>)

或者例如:

np.where(pixels > 0, pixels / other_pxls, 0)

符合您的需求。