使用字典将图像中的RGB值映射到相应的ID

2024-09-30 22:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个分割问题,其中给定一个图像,每个RGB值对应一个类标签。我的问题是如何有效地将RGB值从图像(numpy数组)映射到相应的类标签图像。你知道吗

让我们提供以下简化示例:

color2IdMap 
{(100,0,100):0, (0,200,0):2}

labelOld 
array([[[100,0,100],
         [0,200,0]],
       [[100,0,100],
        [0,200,0]]], dtype=uint8)

(在实际示例中,colorIdMap将有大约20个条目,labelld将是一个形状数组:(1024512,3))

现在我希望结果是下面的映射数组。形状:(1024512)

labelNew
array([[ 0, 2],
       [ 0, 2]])

我尝试使用循环和列表理解来实现这一点,但是这两种方法都非常慢(每幅图像大约10秒,对于250K图像来说这是一个很大的数字)。我想知道有没有更快的方法。你知道吗


尝试的方法1:

labelNew = np.empty((1052,1914), dtype=np.uint8)
for i in range(1052):
    for j in range(1914):
        labelNew[i, j] = color2IdMap[tuple(labelOld[i, j])]

尝试的方法2:

labelNew = [[color2IdMap[tuple(x)] for x in y] for y in labelOld]

所以,我的问题是,有没有更快更有效的方法?你知道吗


Tags: 方法in图像示例forrgb标签数组
1条回答
网友
1楼 · 发布于 2024-09-30 22:27:49

以下是一种基于dimensionality-reduction的方法-

# Get keys and values
k = np.array(list(color2IdMap.keys()))
v = np.array(list(color2IdMap.values()))

# Setup scale array for dimensionality reduction
s = 256**np.arange(3)

# Reduce k to 1D
k1D = k.dot(s)

# Get sorted k1D and correspondingly re-arrange the values array
sidx = k1D.argsort()
k1Ds = k1D[sidx]
vs = v[sidx]

# Reduce image to 2D
labelOld2D = np.tensordot(labelOld, s, axes=((-1),(-1)))

# Get the positions of 1D sorted keys and get the correspinding values by
# indexing into re-arranged values array
out = vs[np.searchsorted(k1Ds, labelOld2D)]

或者,我们可以使用sidx作为np.searchsorted的分类器输入参数来获得最终输出-

out = v[sidx[np.searchsorted(k1D, labelOld2D, sorter=sidx)]]

相关问题 更多 >