【问题标题】:Explanation of Matlab's bwlabel,regionprops & centroid functionsMatlab的bwlabel,regionprops & centroid函数讲解
【发布时间】:2014-11-17 00:53:43
【问题描述】:

我花了一整天的时间阅读上面的 MATLAB 函数。即使在 MathWorks 网站上,我似乎也无法在网上找到任何好的解释!

如果有人能解释bwlabelregionpropscentroid,我将不胜感激。如果应用于灰度图像,它们如何工作?

具体来说,它们在下面的代码中被使用。上面的函数如何应用到下面的代码中?

fun=@minutie; L = nlfilter(K,[3 3],fun); 
%% Termination LTerm=(L==1); 
figure; imshow(LTerm) 
LTermLab=bwlabel(LTerm); 
propTerm=regionprops(LTermLab,'Centroid'); 
CentroidTerm=round(cat(1,LTerm(:).Centroid)); 
figure; imshow(~K) 
set(gcf,'position',[1 1 600 600]); hold on 
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro') 

【问题讨论】:

  • 这需要访问“minutie”。我假设您正在查看一些指纹识别或分析代码,因此这可能是试图使您手指的细小点更加明显。 nlfilter 代表非线性滤波器。您正在选择一个 3 x 3 像素的邻域并分析这些大小的邻域,并将该函数应用于图像中的每个邻域。我不会使用bwlabel,因为他们将其视为二值图像,但是在检测到细节点后,您会检测质心并显示图像中第一个质心所在的点。
  • 我也不明白为什么你已经在这里要求澄清此代码时问这个问题:stackoverflow.com/questions/25982080/… - Jigg 的解释很好。

标签: image matlab image-processing centroid


【解决方案1】:

这真是一口难言的解释!...不过,我很乐意向您解释。但是,我有点惊讶您无法理解 MathWorks 的文档。它实际上非常擅长解释它们的很多(如果不是全部......)功能。

顺便说一句,bwlabelregionprops 对于灰度图像未定义。您只能将这些应用于二进制图像

更新: bwlabel 仍然有接受二进制图像的限制,但 regionprops 不再有这个限制。它还可以接收通常从bwlabel 输出的标签 矩阵以及二进制图像。

假设二进制图像是你想要的,我对每个函数的解释如下。


bwlabel

bwlabel 接收二值图像。这个二值图像应该包含一堆彼此分离的对象。属于对象的像素用1 / true 表示,而作为背景的像素用0 / false 表示。例如,假设我们有一个看起来像这样的二进制图像:

0  0  0  0  0  1  1  1  0  0
0  1  0  1  0  0  1  1  0  0
0  1  1  1  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  1
0  0  0  0  0  0  0  0  1  1
0  0  1  1  1  1  0  0  1  1

您可以在这张图片中看到,这张图片中有 四个 对象。对象的定义是那些1 的像素,它们通过查看本地邻域连接成链。我们通常会查看 8 像素邻域,您可以在其中查看北、东北、东、东南、南、西南、西、西北方向。另一种说法是对象是8-connected。为简单起见,有时人们会查看 4 像素社区,而您只需查看北、东、南和西方向。这意味着对象是4-connected

bwlabel 的输出将为您提供一个整数映射,其中每个对象分配一个唯一 ID。因此,bwlabel 的输出看起来像这样:

0  0  0  0  0  3  3  3  0  0
0  1  0  1  0  0  3  3  0  0
0  1  1  1  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0  4
0  0  0  0  0  0  0  0  4  4
0  0  2  2  2  2  0  0  4  4

因为 MATLAB 在主要列中处理事物,这就是标签是您在上面看到的方式的原因。因此,bwlabel 为您提供每个像素的成员身份。如果每个像素落在对象上,这会告诉您每个像素所属的位置。此地图中的0 对应于背景。要拨打bwlabel,您可以:

L = bwlabel(img);

img 将是您提供给函数的二进制图像,L 是我刚才谈到的整数映射。此外,您可以向bwlabel 提供 2 个输出,第二个参数告诉您图像中存在多少对象。因此:

[L, num] = bwlabel(img);

在上面的示例中,num 将是 4。作为另一种调用方法,您可以指定要检查的连接像素邻域,因此您可以这样做:

[L, num] = bwlabel(img, N);

N 将是您要检查的像素邻域(即 4 或 8)。


regionprops

regionprops 是我日常使用的一个非常有用的功能。 regionprops 测量黑白图像中的各种图像数量和特征。具体来说,给定一张黑白图像,它会自动确定每个 8 连接的连续白色区域的属性。这些特殊属性之一是质心。这也是质心。您可以将其视为对象的“中间”。这将是每个对象中间所在的(x,y) 位置。因此,regionpropsCentroid 的工作原理是,对于图像中看到的每个对象,这将计算对象的质心,regionprops 的输出将返回一个结构,其中每个元素结构会告诉您黑白图像中每个对象的质心是什么。 Centroid 只是属性之一。还有其他有用的功能,但我假设您不想这样做。要拨打regionprops,您可以这样做:

s = regionprops(img, 'Centroid');

上面的代码将计算图像中每个对象的质心。您可以为 regionprops 指定其他标志以指定您想要的每个功能。我强烈建议您查看regionprops 可以计算的所有可能的功能,因为其中有许多在各种不同的应用程序和情况下都很有用。

此外,通过省略任何标志作为函数的输入,您将默认计算图像中的所有特征。因此,如果我们要在 MATLAB 中声明我们在上面看到的图像,这就是我运行 regionprops 后会发生的情况。之后,让我们计算质心是什么:

img = logical(...
   [0  0  0  0  0  1  1  1  0  0;
    0  1  0  1  0  0  1  1  0  0;
    0  1  1  1  0  0  0  0  0  0;
    0  0  0  0  0  0  0  0  0  1;
    0  0  0  0  0  0  0  0  1  1;
    0  0  1  1  1  1  0  0  1  1]);
s = regionprops(img, 'Centroid');

...最后当我们显示质心时:

>> disp(cat(1,s.Centroid))

3.0000    2.6000
4.5000    6.0000
7.2000    1.4000
9.6000    5.2000

因此,第一个质心位于(x,y) = (3, 2.6),下一个质心位于(x,y) = (4.5, 6),依此类推。特别注意x 坐标是,而y 坐标是


希望这很清楚!

【讨论】:

  • 感谢您的详细解释。但是,以上所有内容都用于我上面包含的代码中。你能解释一下代码的作用吗?我很想知道。我花了很长时间试图弄清楚但没有运气:(
  • @rayryeng 你知道regionprops 在 Matlab 2016a 中的行为吗?我现在在 Matlab 2016a 中得到 0x1 结构,而在旧的 Matlabs 中得到完全不同的结果。我在这里开了一个关于这个案子的新帖子stackoverflow.com/q/35970657/54964
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2017-01-11
  • 2016-01-09
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多