【问题标题】:Labeling image regions标记图像区域
【发布时间】:2017-01-11 15:48:39
【问题描述】:

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

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

示例图片:

【问题讨论】:

  • 你看bwlabel了吗?您还想要 MATLAB 或 Python 解决方案吗?没有“一刀切”。
  • 那是因为bwlabel 需要一个 BW(二进制)图像。如果您首先对图像进行阈值(并且可能反转),您将获得两个连接的组件加上 0 背景..
  • 样本图像已经被标注,每张都有不同的灰度
  • 您要查找多少个标签?你有 3 级灰度(加上背景),你有 8 个形状。输出应该是什么?
  • 这正是我所需要的,两个具有相同灰度的断开区域应该收到不同的标签。示例图像的输出应该是具有 9 个不同标签的图像。接受的答案正是我想要的。

标签: python matlab


【解决方案1】:

您可以通过遍历图像中的唯一值、创建具有该值的对象的蒙版并为每个此类蒙版执行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');

这是它的情节:

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

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

【讨论】:

  • 非常感谢。这正是我需要的!
【解决方案2】:

除非已经有一个函数可以满足你的需求,否则你总是可以自己编写。

如果我必须这样做,我会考虑使用联合查找算法之类的方法,将所有颜色相同的相邻/连接像素分组到集合中,然后为这些集合分配标签。

使用伪代码的简单(效率较低但不需要联合查找)实现:

# 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.

【讨论】:

  • MATLAB 有几个用于图像标记/连接组件/分割的内置函数,所以自己编写可能是矫枉过正。
  • 是的,如果它还没有出现,我会感到惊讶。那只是一个不错的小练习。
  • 感谢您的帮助。接受的答案得到了我所需要的。
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2018-11-13
相关资源
最近更新 更多