我需要采用两个图像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)
。
答案 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)
符合您的需求。