我花了一整天时间阅读上述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')
答案 0 :(得分:17)
这很难解释!......然而,我很乐意向你解释。但是,我对您无法理解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-connected 。为简单起见,有时候人们会看到4像素的社区,在那里您可以看到北,东,南和西方向。这个woudl意味着对象 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)
位置。因此,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
坐标是行。
希望这很清楚!