颜色分割,通过重建打开,边界跟踪,多形性
今年夏天早些时候,克利夫给我发了一张拼图的图片。
他询问如何将单个的“奶酪片”转换成用于绘图和操作的补丁对象,可能是这样的:
在我今天的文章中,我将详细阐述这一步。
我想到的第一件事就是用颜色把拼图从图像的其余部分分割开来。我用了
颜色阈值应用程序
确定CIELAB空间中的一些阈值。
RGB = imread(“Cheese_puzzle.png”);
在colorThresholder的帮助下选择的阈值。
mask = ((30 <= L) & (L <= 98)) &...
((-20 <= a) & (a <= 16)) &...
接下来,我们需要去除多余的前景像素。我将使用数学形态学的一种方法
重建开放
.第一步是以一种消除所有不需要的像素的方式侵蚀图像,同时保留至少一部分我们想保留的对象。一条垂直线的侵蚀会使细水平线消失,一条水平线的侵蚀也会使细垂直线消失。
Mask2 = imerosion (mask,ones(21,1));
Mask3 = imerosion (mask2,ones(1,21));
在上图中,无关的前景像素消失了,但拼图块已经缩小了。我会用形态重建来恢复整个拼图。
Mask4 = imrebuild (mask3,mask);
太好了。现在,我们如何把这些拼图变成某种容易绘制的表示形式呢?Cleve曾经建议过补丁对象,但是创建包含洞的补丁对象是很复杂的。我建议使用
polyshape
代替。一个
polyshape
是一个可以表示由多边形组成的形状的对象。您可以创建
polyshape
从绑定个别区域和孔的多边形集合,以及图像处理工具箱功能
bwboundaries
可以生成这样的多边形列表。
B = bwboundaries(mask4)
b =
9×1细胞
|
1 |
1 |
1820×2双 |
2 |
1687×2双 |
3. |
1669×2双 |
4 |
1771×2双 |
5 |
1328×2双 |
6 |
613×2双 |
7 |
609×2双 |
8 |
457×2双 |
9 |
(472980; 472980) |
的
polyshape
函数可以取一个多边形的边界集合,并自动算出哪些多边形绑定了区域和哪些绑定了孔,但形式不同
polyshape
输入参数有点不同
bwboundaries
产生。这里有一些代码来转换
bwboundaries
输出为
polyshape
可以处理。
ps =多相(X,Y)
警告:多晶体具有重复的顶点、交叉点或其他不一致,可能产生不准确或意外的结果。已修改输入数据以创建定义良好的多形体。
ps =
multihape属性:顶点:[3529×2 double] NumRegions: 6 NumHoles: 3
嗯,这有点乱。在我的图像处理工作中,我经常从多形性中看到这种警告信息。通常是因为我传递了一堆共线顶点给多形体。它们是共线的,因为顶点在图像像素网格上。我通常会忽略这个警告。
不过,还有另一个问题。为什么多晶体的输出说它有6个区域而不是5个?我不得不搜索一下原因。我们可以通过放大右下角拼图块的一个角落,并叠加由bwboundaries跟踪的边界来看到它。
情节(b {5} (:, 2), b {5} (: 1),“b”)
有一个点,跟踪边界是自相交的,这就导致
polyshape
将底部的小三角形作为一个单独的区域。我们可以做一个基于区域的
polyshape
去除掉那个三角形。
将多形物拆分为单独的区域:
Ps_regions =区域(ps)
ps_regions =
6×1多相数组的属性:顶点NumRegions NumHoles
求每个区域的面积:
Region_areas = area(ps_regions)
105
×
1.7261 1.5884 1.0799 1.9781 0.9128 0.0000
去掉这个小区域:
Ps_regions (region_areas < 1) = []
ps_regions =
5×1多相数组的属性:顶点NumRegions NumHoles
现在我们可以绘制拼图了。如果将一组多面体传递给plot,它将分别为每个多面体着色。
我喜欢多义词。它们提供了丰富的有用函数集合(参见
polyshape参考页面
)。您可以修改它们、将它们分开、使用布尔操作将它们连接起来、测量它们、查询点位置等等。
例如,
polybuffer
函数可以根据在形状周围创建“缓冲区”的想法来扩展(或收缩)多形体。为了说明这一点,让我们以其中一块拼图为例,给它一个50像素的缓冲区。
Ps5_50 = polybuffer(ps5,50);
多义词在你的工作中有用吗?我很想听听。请留下评论。
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。