目前,我对指纹识别和细节提取非常感兴趣。我在网上找到了下面的代码,不知道有没有人愿意解释一下?我查过centroid,regionprops等,我对这些有一点了解,但下面的代码让我感到困惑!
fun=@minutie;
L = nlfilter(K,[3 3],fun);
%% Termination
LTerm=(L==1);
imshow(LTerm)
LTermLab=bwlabel(LTerm);
propTerm=regionprops(LTermLab,'Centroid');
CentroidTerm=round(cat(1,propTerm(:).Centroid));
imshow(~K)
set(gcf,'position',[1 1 600 600]);
hold on
plot(CentroidTerm(:,1),CentroidTerm(:,2),'ro')
%% Bifurcation
LBif=(L==3);
LBifLab=bwlabel(LBif);
propBif=regionprops(LBifLab,'Centroid','Image');
CentroidBif=round(cat(1,propBif(:).Centroid));
plot(CentroidBif(:,1),CentroidBif(:,2),'go')发布于 2014-09-23 06:19:42
代码首先对邻域为3x3像素的二值图像进行过滤。nfilter是一种移动滤波函数。它将遍历作为参数给定的图像中的所有像素,并根据相邻像素的值应用操作。
我不知道minutie过滤器的确切内容,但从其余代码判断,它可能计算所有1附近的值为1的像素。换句话说,它将等于线段末尾的1,当有3个分支(分支)时等于3。
示例:
让过滤器对邻域中的元素进行汇总,如下所示:
sum(block(1,1:3), block(3,1:3), block(2,1), block(2,3))*block(2, 2);其中block表示二值图像的每个像素周围的邻域。
在下面的左侧矩阵中(如果忽略边界例外),有一个位置在其3x3邻域中恰好有一个1,在右侧矩阵中有一个位置在其3x3邻域中恰好有三个1。
[0 0 0 0 0 [0 0 1 0 0
0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 1 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 0 1 0 0] 0 0 1 0 0]过滤后的输出将是:
[0 0 0 0 0 [0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 3 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0] 0 0 0 0 0]它在左边的矩阵中找到了一个终结点,在右边的矩阵中找到了一个分叉。
过滤后的图像在值1和3处设置阈值,然后bwlabel和regionprops的使用对我来说有点神秘,因为分叉和终止是单点,它们的位置就是它们的索引。我认为您可以简单地使用如下命令来实现终止和分叉坐标的检测:
[It Jt]= find(L==1);
[Ib Jb]= find(L==3);我能想到的一个原因是,在matlab中,图像和数组中的坐标是不同的,这两个函数以图像格式输出坐标,这更容易在原始图像上绘制。†。
https://stackoverflow.com/questions/25982080
复制相似问题