解释Matlab的bwlabel,regionprops&质心函数

时间:2014-09-22 23:23:23

标签: image matlab image-processing centroid

我花了一整天时间阅读上述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') 

1 个答案:

答案 0 :(得分:17)

这很难解释!......然而,我很乐意向你解释。但是,我对您无法理解MathWorks的文档感到有些惊讶。它实际上很擅长解释他们的功能(如果不是全部......)。

对于灰度图像,BTW,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像素的社区,在那里您可以看到北,东,南和西方向。这个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坐标是


希望这很清楚!