2014-09-22 149 views
2

我花了一整天的时间阅读上述MATLAB函数。我似乎无法在网上找到任何好的解释,即使在MathWorks网站上也是如此!Matlab的bwlabel,regionprops和质心函数的说明

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

具体而言,它们正用于下面的这段代码中。上述功能如何适用于下面的代码?

[email protected]; 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

这需要访问“'minutie'”。我假设你正在查看一些指纹识别或分析代码,所以这可能是为了让你的手指的小点更明显。 'nlfilter'代表非线性滤波器。您正在选择一个3 x 3像素的邻域并分析这些大小的邻域,并将该功能应用于图像中的每个邻域。我不会使用'bwlabel'作为二进制图像,但是在检测完分数点后,您会检测质心并显示图像中第一个质心的位置。 – rayryeng 2014-09-23 13:05:30

+0

我也不明白为什么你问这个问题,当你已经要求澄清此代码在这里:http://stackoverflow.com/questions/25982080/matlab-fingerprint-minutia-extraction - Jigg的解释是精细。 – rayryeng 2014-09-23 13:06:22

回答

10

这真是一口解释!不过,我很乐意向您解释。但是,我对你无法理解MathWorks的文档感到有些惊讶。它的功能其实很好解释了很多(如果不是全部的话)。

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

更新: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在列优先处理的事情,这就是为什么标签是你怎么看上面。因此,bwlabel为您提供每个像素的成员资格。这告诉你每个像素属于哪里,如果它落在一个对象上。 0在这个地图对应的背景。要调用bwlabel,你可以这样做:

L = bwlabel(img); 

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

[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坐标是


希望这是明确的!

+0

感谢您的详细解释。但是,以上所有内容均用于上面包含的代码中。你能向我解释代码的作用吗?我非常有兴趣了解。我花了很长时间试图找出它,但没有运气:( – user1877082 2014-09-23 12:43:15

+0

@rayryeng你知道'regionprops'在Matlab 2016a中的行为吗?我在Matlab 2016a中获得0x1结构,而在旧版本中得到完全不同的结果Matlabs。我在这里http://stackoverflow.com/q/35970657/54964打开了一个关于这个案例的新主题 – 2016-03-13 16:14:02