我有一个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中用数组/向量替换标量/布尔值来概括?”
答案 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)