标记图像区域

时间:2017-01-11 15:48:39

标签: python matlab

我有一个包含彩色区域的图像(其中一些使用相同的颜色),我希望每个区域都有不同的颜色。

目标是使用不同的颜色/标签对每个区域进行着色/标记。

示例图片:

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以通过循环图像中的唯一值,使用该值创建对象的蒙版,并为每个此类蒙版执行bwlabel来实现此目的。这将为该掩码中的每个连接组件提供唯一标签,您可以通过添加先前已找到的标签数量来收集所有掩码中的标签:

img = imread('i5WLA.png');

index = zeros(size(img));
for iGray = unique(img(:)).'  %'
  mask = (img == iGray);
  L = bwlabel(mask, 4);
  index(mask) = L(mask)+max(index(:));
end

subplot(2,1,1);
imshow(img, []);
title('Original');
subplot(2,1,2);
imshow(index, []);
title('Each region labeled uniquely');

以下是这样的情节:

enter image description here

您现在可以看到每个连接的对象都有自己唯一的灰色值。然后,您可以使用ind2rgblabel2rgb从这个新的索引图像创建彩色图像,并选择要使用的色彩图(此处我使用hsv):

rgbImage = ind2rgb(index, hsv(max(index(:))));
imshow(rgbImage);
% Or...
rgbImage = label2rgb(index, @hsv);
imshow(rgbImage);

enter image description here

答案 1 :(得分:0)

除非已经有一个可以满足您想要的功能,否则您可以自己编写。

如果我不得不这样做,我会考虑使用union-find算法将所有相等颜色的相邻/连接像素分组成组,然后为这些组分配标签。

使用伪代码实现的一种天真(效率较低但不需要联合查找):

# assume pixels are stored in numpy array. Use your imagination to adjust as required.
put each pixel into its own set.
for pixel in pixels:
  neighbors = adjacent_same_color_pixels(pixel)
  find the sets that contain pixel, and the sets that contain the neighbors
  join all those sets together, delete the original sets

now there's one set for each connected same-color shape.
assign labels as desired.