我需要更改图像中的所有RGB值,如果该RGB值在没有循环的列表中
我知道,要更改RGB值,我只需执行以下操作:
img[np.all(img == (99, 121, 109), axis=-1)] = (255,255,255)
例如,在我的例子中,值(99, 121, 109)
属于一个列表
rgbL = [[99, 121, 109],
[102, 118, 107],
[102, 126, 114],
.......,
[105, 114, 101]]
为了更改属于我的rgbL
列表的图像中的所有RGB值,我需要循环到我的rgbL
列表中的所有值。但是我的名单太长了。有没有一种方法可以不用循环就可以做到这一点
不幸的是,没有快速的方法可以做到这一点。无论您使用循环还是优化的numpy解决方案,在引擎盖下,您都必须根据} 与数据的structured array^{} 组合来执行正确的分组
rgbL
的每个元素检查每个像素。考虑到所有这些,您可以使用^{诀窍是制作一个表示像素的custom type。这样,您可以比较整个元素,而不是颜色通道,这是默认情况下
isin
所做的不能将像素数据类型定义为这样的子数组类型
pixel = np.dtype((img.dtype, img.shape[-1]))
。这将在您尝试查看数据时导致错误现在,您可以将
img
视为pixel
元素的2D数组,而不是uint8
或float
的3D数组,具体视情况而定:您可以对列表执行相同的操作:
你也可以
您不能使用
np.array(rgbL, dtype=pixel)
,因为在这种情况下,元素将无法正确初始化现在
isin
将为您提供所需的掩码:您可以直接应用遮罩:
如果要设置通道之间不同的值,请记住使用元组指定像素条目:
因为
data
是对img
的一个视图,所以就完成了注意:仅当图像在三维中连续时,此操作才有效。否则,您将无法对两个阵列使用相同的数据类型。如果不是这样,则必须复制图像数据,使其至少在第三维中是连续的。对于大多数正常的阵列来说,它们不是超光谱图像或其他东西上的奇怪视图,你会没事的
TL;DR
如果这适用于单一颜色:
这应该适用于以下列表:
使用cv2 LUT(查找表)-您可以定义自己的表,并通过这种方式直接指定替换表
相关问题 更多 >
编程相关推荐