如何将伪彩色图像映射到特定颜色标签

0 投票
2 回答
1539 浏览
提问于 2025-04-17 20:18

我有一张伪彩色图像,如下所示。我想把这张图像转换成一个数组,这样我就可以给每个伪彩色区域分配一个标签。这样我就可以仅通过标签值来访问图像。

 r_channel = image[:, :, 0]
    g_channel = image[:, :, 1]
    b_channel = image[:, :, 2]
    label_map = (0.2989) * (r_channel) + (0.5870) * g_channel + (0.1140) * b_channel
    label_map = label_map * 500 / 255
    label_map = np.round(label_map).astype(int)

但是问题是,这样做会导致标签重复。我希望每个区域都有一个唯一的标签,最好是从1开始按顺序排列。

在这里输入图像描述

2 个回答

1

给定一个数值数组,其中非零的值被视为“物体”,而零则被视为“背景”,你可以使用 scipy.ndimage.label 函数来给这些物体打标签:

import scipy
from scipy import ndimage
import numpy as np

fname='/tmp/splotches.png'
arr = scipy.misc.imread(fname) 
print(arr.shape)
# (160, 240, 3)

r, g, b = np.rollaxis(arr, axis = -1)
label_map = 0.2989 * r + 0.5870 * g + 0.1140 * b
label_map = label_map * 500 / 255
label_map = np.round(label_map).astype(int)
print(label_map.shape)
# (160, 240)

seen = set()
region = {}
i = 1
for val in label_map.flat:
    if val not in seen:
        seen.add(val)
        mask = (label_map == val)
        labeled, nr_objects = ndimage.label(mask) 
        for label in range(1, nr_objects+1):
            assert np.any(labeled==label)
            region[i] = labeled==label
            i += 1

print(len(region))
# 382

使用 scipy.ndimage.label,发现了382个区域。

0

我找到了一种获取标签的独特方法。这是我所做的:

    r_channel = image[:, :, 0]
    g_channel = image[:, :, 1]
    b_channel = image[:, :, 2]
    label_map = 1000000 * (r_channel) + 1000 * g_channel + b_channel
    label_map = np.round(label_map).astype(int)

这样,我现在可以为每个超像素区域获得独特的标签。

撰写回答