numpy有条件地用数组替换标量/布尔值

时间:2013-12-20 12:10:56

标签: python arrays image numpy

我有一个3D数组(x,y,RGBA),我的目标是:

找出哪些像素为空白RGBA = [0,0,0,0]然后将其颜色更改为蓝色,其他像素将颜色更改为绿色。

据我所知,它可以分两步完成:

1-创建一个500x500数组,如果像素有值,则为bool True,如果为空,则为False

2-然后应用函数将[0,0,255,255]替换为True,将[0,255,0,255]

替换为False 经过无数次搜索(我不是一个python向导)后,我设法以pythonic的方式实现了1-(至少我的希望......)

img.shape
>(500, 500, 4)
img_bool = np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2)
img_bool.shape
>(500, 500)

我对第2步的猜测是尝试这样的语法:

img_final = np.where(img_bool, [0,0,255,255], [0,255,0,255])

np.choose(img_bool, [[0,0,255,255],[0,255,0,255], out=img_final)

但是它们给出了相同的错误(非常合乎逻辑,因为两个表达式实际上可能都是一样的)

  

ValueError:形状不匹配:对象不能突变为单个形状

实际上第2步可以通过“如何在numpy.ndarray中用数组/向量替换标量/布尔值来概括?”

1 个答案:

答案 0 :(得分:1)

对于您的第一项任务,使用颜色为正整数的事实,您可以使用

img_bool = img.sum(axis=2)>0

你可以做的第二个

img[img_bool] = [0, 0, 255, 255]
img[~img_bool] = [0, 255, 0, 255]

注意,如果我的描述正确,那么原始表达式将返回反向,即您必须将其更改为

img_bool = ~np.equal(img[:,:], [0, 0, 0, 0]).all(axis=2)