这真是一口解释!不过,我很乐意向您解释。但是,我对你无法理解MathWorks的文档感到有些惊讶。它的功能其实很好解释了很多(如果不是全部的话)。
顺便说一句,bwlabel
和regionprops
是不是灰度图像定义。您只能将这些应用于二进制图像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
坐标是行。
希望这是明确的!
这需要访问“'minutie'”。我假设你正在查看一些指纹识别或分析代码,所以这可能是为了让你的手指的小点更明显。 'nlfilter'代表非线性滤波器。您正在选择一个3 x 3像素的邻域并分析这些大小的邻域,并将该功能应用于图像中的每个邻域。我不会使用'bwlabel'作为二进制图像,但是在检测完分数点后,您会检测质心并显示图像中第一个质心的位置。 – rayryeng 2014-09-23 13:05:30
我也不明白为什么你问这个问题,当你已经要求澄清此代码在这里:http://stackoverflow.com/questions/25982080/matlab-fingerprint-minutia-extraction - Jigg的解释是精细。 – rayryeng 2014-09-23 13:06:22