Python 如何将假彩色图像映射到为每种颜色指定的特定标签

Python 如何将假彩色图像映射到为每种颜色指定的特定标签,python,Python,我有一个假彩色图像,如下所示。我想把这个图像转换成一个数组,在这里我可以为每个假彩色区域指定一个标签。因此,我可以使用该标签值访问图像。 我试着用 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

我有一个假彩色图像,如下所示。我想把这个图像转换成一个数组,在这里我可以为每个假彩色区域指定一个标签。因此,我可以使用该标签值访问图像。 我试着用

 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开始按升序排列


给定一个值数组,其中非零值被视为“对象”,零被视为“背景”,您可以标记对象 使用该功能:

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个区域。

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

    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)

因此,现在我得到了每个超级像素区域的唯一标签。

我想我的问题还不够清楚。实际上,我面临的问题是,地图中使用的颜色都是不同的,对应于不同的区域。但是当我使用转换时,
label\u-map=0.2989*r+0.5870*g+0.1140*b label\u-map=label\u-map*500/255 label\u-map=np.round(label\u-map)。astype(int)
一些应该不同的颜色会得到相同的值。我只是不希望发生这种情况,我希望所有地区都能得到一个唯一的标识符。我感谢你的回答,但在label_map中,可能有一些不同的地区具有类似的'0.2989*r+0.5870*g+0.1140*b'值。这就是为什么我认为这种转换是不正确的。检查我发布的答案。谢谢你的帮助:)