首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于值将标量映射到数组:图像处理2D到3D - NumPy / Python

基于值将标量映射到数组:图像处理2D到3D - NumPy / Python
EN

Stack Overflow用户
提问于 2020-05-07 14:48:23
回答 2查看 130关注 0票数 1

给定形状(height, width)的Numpy矩阵,我正在寻找最快的方法来创建形状(height, width, 4)的另一个Numpy矩阵,其中4表示RGBA值。我想做这个基于值的工作;因此,对于第一个矩阵中所有的0值,我希望在第二个矩阵中的同一位置有一个[255, 255, 255, 0]值。

我想用NumPy来做这件事,而不需要像下面这样缓慢地迭代:

代码语言:javascript
复制
for i in range(0, height):
    for j in range(0, width):
        if image[i][j] = 0:
            new_image[i][j] = [255, 255, 255, 0]
        elif image[i][j] = 1:
            new_image[i][j] = [0, 255, 0, 0.5]

如您所见,我正在创建一个矩阵,其中值0变为透明白色,1变为绿色,α为0.5;是否有更快的NumPy解决方案?

我猜想numpy.where会极大地帮助加速这个过程,但是我还没有找到多个和多个值转换的适当实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-07 15:00:05

对于一个更干净的解决方案,特别是在处理多个标签时,我们可以使用np.searchsorted来追溯映射的值,如下所示-

代码语言:javascript
复制
# Edit to include more labels and values here            
label_ar = np.array([0,1]) # sorted label array
val_ar = np.array([[255, 255, 255, 0],[0, 255, 0, 0.5]])

# Get output array
out = val_ar[np.searchsorted(label_ar, image)]

请注意,这假定来自image的所有唯一标签都在label_ar中。

那么,假设我们在23image中又有两个标签,类似这样的东西-

代码语言:javascript
复制
for i in range(0, height):
    for j in range(0, width):
        if image[i,j] == 0:
            new_image[i,j] = [255, 255, 255, 0]
        elif image[i,j] == 1:
            new_image[i,j] = [0, 255, 0, 0.5]
        elif image[i,j] == 2:
            new_image[i,j] = [0, 255, 255, 0.5]
        elif image[i,j] == 3:
            new_image[i,j] = [255, 255, 255, 0.5]

我们将相应地编辑标签和值,并使用相同的searchsorted解决方案-

代码语言:javascript
复制
label_ar = np.array([0,1,2,3]) # sorted label array
val_ar = np.array([
    [255, 255, 255, 0],
    [0, 255, 0, 0.5],
    [0, 255, 255, 0.5],
    [255, 255, 255, 0.5]])
票数 3
EN

Stack Overflow用户

发布于 2020-05-07 15:05:01

你是对的,np.where是你解决这个问题的方法。哪里是一个矢量化函数,所以它应该比您的解决方案快得多。

我在这里假设,这里没有我所知道的elif,但是您可以通过嵌套where语句来解决这个问题。

代码语言:javascript
复制
 new_image = np.where(
           image == 0,
           [255, 255, 255, 0],
           np.where(
                image == 1,
                [0, 255, 0, 0.5],
                np.nan
           )
      )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61660767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档