我整天都在阅读上面的MATLAB函数。即使在MathWorks网站上,我似乎也找不到在线的好解释!
如果有人可以解释bwlabel
,regionprops
和centroid
,我将不胜感激。如果应用于灰度图像,它们如何工作?
具体来说,它们在下面的代码中使用。以上功能如何适用于以下代码?
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')
最佳答案
解释起来真是一大口!……不过,我很想向您解释。但是,我对您不理解MathWorks的文档感到有些惊讶。实际上,它很好地解释了许多(如果不是全部)它们的功能。
BTW,bwlabel
和regionprops
是,未为灰度图像定义。您只能将它们应用于二进制图像。
更新: 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连接的。为简单起见,有时人们会看到4像素邻域,而您只是在看北,东,南和西方向。这意味着对象是 4连接的。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处理的是main列中的内容,所以这就是为什么您在上面看到标签的原因。因此,bwlabel
为您提供每个像素的成员资格。这可以告诉您每个像素落在对象上的位置。此 map 中的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)
位置。这样,Centroid
的regionprops
的工作原理是,对于图像中看到的每个对象,这将计算该对象的质心,并且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
坐标是行。希望这很清楚!