用MATLAB进行图像处理

图像处理概念,算法和MATLAB

拼图和多义词

颜色分割,通过重建打开,边界跟踪,多形性
今年夏天早些时候,克利夫给我发了一张拼图的图片。
Cheese_puzzle.png
他询问如何将单个的“奶酪片”转换成用于绘图和操作的补丁对象,可能是这样的:
colored-puzzle-pieces.png
克利夫正在研究后来发生的事情 “多边形,多义词和谜题,”他2022年8月21日的博客文章
在我今天的文章中,我将详细阐述这一步。
我想到的第一件事就是用颜色把拼图从图像的其余部分分割开来。我用了 颜色阈值应用程序 确定CIELAB空间中的一些阈值。
color-thresholder-screenshot.png
RGB = imread(“Cheese_puzzle.png”);
实验室= rgb2lab(rgb);
在colorThresholder的帮助下选择的阈值。
[L,a,b] = imsplit(实验室);
mask = ((30 <= L) & (L <= 98)) &...
((-20 <= a) & (a <= 16)) &...
((26 <= b) & (b <= 83));
imshow(面具)
接下来,我们需要去除多余的前景像素。我将使用数学形态学的一种方法 重建开放 .第一步是以一种消除所有不需要的像素的方式侵蚀图像,同时保留至少一部分我们想保留的对象。一条垂直线的侵蚀会使细水平线消失,一条水平线的侵蚀也会使细垂直线消失。
Mask2 = imerosion (mask,ones(21,1));
imshow (mask2)
Mask3 = imerosion (mask2,ones(1,21));
imshow (mask3)
在上图中,无关的前景像素消失了,但拼图块已经缩小了。我会用形态重建来恢复整个拼图。
Mask4 = imrebuild (mask3,mask);
imshow (mask4)
太好了。现在,我们如何把这些拼图变成某种容易绘制的表示形式呢?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 可以处理。
K = 1:长度(b)
X{k} = b{k}(:,2);
Y{k} = b{k}(:,1);
结束
ps =多相(X,Y)
警告:小于3点的边界已被删除。
警告:多晶体具有重复的顶点、交叉点或其他不一致,可能产生不准确或意外的结果。已修改输入数据以创建定义良好的多形体。
ps =
multihape属性:顶点:[3529×2 double] NumRegions: 6 NumHoles: 3
嗯,这有点乱。在我的图像处理工作中,我经常从多形性中看到这种警告信息。通常是因为我传递了一堆共线顶点给多形体。它们是共线的,因为顶点在图像像素网格上。我通常会忽略这个警告。
不过,还有另一个问题。为什么多晶体的输出说它有6个区域而不是5个?我不得不搜索一下原因。我们可以通过放大右下角拼图块的一个角落,并叠加由bwboundaries跟踪的边界来看到它。
数字
imshow(面具)
持有
情节(b {5} (:, 2), b {5} (: 1),“b”)
持有
xlim(1140年[1120])
ylim(1010年[990])
有一个点,跟踪边界是自相交的,这就导致 polyshape 将底部的小三角形作为一个单独的区域。我们可以做一个基于区域的 polyshape 去除掉那个三角形。
将多形物拆分为单独的区域:
Ps_regions =区域(ps)
ps_regions =
6×1多相数组的属性:顶点NumRegions NumHoles
求每个区域的面积:
Region_areas = area(ps_regions)
region_areas = 6×1
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,它将分别为每个多面体着色。
情节(ps_regions)
ij
平等的
我喜欢多义词。它们提供了丰富的有用函数集合(参见 polyshape参考页面 )。您可以修改它们、将它们分开、使用布尔操作将它们连接起来、测量它们、查询点位置等等。
例如, polybuffer 函数可以根据在形状周围创建“缓冲区”的想法来扩展(或收缩)多形体。为了说明这一点,让我们以其中一块拼图为例,给它一个50像素的缓冲区。
Ps5 = ps_regions(5);
Ps5_50 = polybuffer(ps5,50);
数字
情节(ps5_50)
ij
平等的
持有
情节(ps5)
持有
多义词在你的工作中有用吗?我很想听听。请留下评论。
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。