我有一个 3D 数组(x、y、RGBA),我的目标是:
找到哪些像素为空白 RGBA=[0,0,0,0] 然后将它们的颜色更改为蓝色,对于其他像素将颜色更改为绿色。
据我所知,它可以分两步完成:
1- 创建一个 500x500 的数组,如果像素有值则为 True,如果为空则为 False
2- 然后应用一个函数将 True 替换为 [0,0,255,255] 并将 False 替换为 [0,255,0, 255]
经过多次搜索(我不是 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: shape mismatch: objects cannot be breascast to a single shape
事实上,第 2 步可以总结为“如何用 numpy.ndarray 中的数组/向量替换标量/ bool 值?”
请您参考如下方法:
对于您的第一个任务,利用颜色是正整数这一事实,您可以使用
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)
