在MATLAB中标记图像上的终止和分叉手指细节点

时间:2014-12-06 18:45:01

标签: matlab image-processing fingerprint

我有一个关于指纹匹配的项目,我在标记图像上的终止点和分叉处时遇到了困难。我已经存储了像素的坐标。我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

假设您的图像存储在名为im的灰度图像中,并且您的终止点和分叉点存储在2D矩阵中,其中第一列表示行,第二列表示每个点的列,您可以使用sub2ind轻松完成此操作。 sub2ind将2D坐标转换为线性索引,以便您可以轻松地对图像中的像素或矩阵中的位置进行快速矢量化。因此,通过将图像堆叠三次作为3D矩阵,将灰度图像转换为RGB图像。如果您还记得,RGB颜色模型中的灰度图像使所有红色,绿色和蓝色通道都相同。例如,灰色为(R,G,B) = (128,128,128)

让我们将您的分叉点称为bifur,将终点称为term,并使用我之前指定的2D矩阵格式。因此,做这样的事情:

%// Get linear indices for bifurcation and termination points
ind_b = sub2ind(size(im), bifur(:,1), bifur(:,2));
ind_t = sub2ind(size(im), term(:,1), term(:,2));

%// Mark them on the image
red = im;
green = im;
blue = im;

red(ind_b) = 255;
green(ind_b) = 0;
blue(ind_b) = 0;

red(ind_t) = 0;
green(ind_t) = 255;    
blue(ind_t) = 0;

im_colour = cat(3, red, green, blue);
imshow(im_colour);

让我们慢慢地浏览一下这段代码。我首先弄清楚分叉和终止点在图像中的位置的线性指数。我接下来要做的是创建红色,绿色和蓝色通道,它们都是原始图像的副本。在此之后,我访问每个颜色通道并用不同的颜色标记分叉和终止点。对于分叉点,我将它们制成纯红色或(R,G,B) = (255,0,0)。对于终止点,我将它们设为纯绿色或(R,G,B) = (0,255,0)。一旦我设置了点的颜色,我就会通过将通道与cat一起堆叠来创建彩色图像,并专门选择第三个维度。我终于在最后展示了这张照片。

您可能还需要使用的是图像上标记的大小。如您所见,标记的像素本身就是单个像素,并且根据图像的分辨率,您可能会或可能无法在图像中正确地看到它们。因此,我建议您在原始点周围的网格内标记像素。也许你可以把它做成围绕感兴趣像素的5 x 5网格。有了这个,也许为每个点制作一个for循环并标记围绕此点的5 x 5像素网格。我还会假设你的标记在图像中足够好,这样我们就不会冒险将网格划出界限。因此代码将被修改如下:

%// Get linear indices for bifurcation and termination points
ind_b = [];
for idx = 1 : size(bifur,1)
    [c,r] = meshgrid(bifur(idx,2)-2:bifur(idx,2)+2, bifur(idx,1)-2:bifur(idx,1)+2);
    c = c(:);
    r = r(:);
    ind_b = [ind_b; sub2ind(size(im), r, c);
end

ind_t = [];
for idx = 1 : size(term,1)
    [c,r] = meshgrid(term(idx,2)-2:term(idx,2)+2, term(idx,1)-2:term(idx,1)+2);
    c = c(:);
    r = r(:);
    ind_t = [ind_t; sub2ind(size(im), r, c);
end

%// Mark them on the image
red = im;
green = im;
blue = im;

red(ind_b) = 255;
green(ind_b) = 0;
blue(ind_b) = 0;

red(ind_t) = 0;
green(ind_t) = 255;    
blue(ind_t) = 0;

im_colour = cat(3, red, green, blue);
imshow(im_colour);

改变的是代码的开头。对于我们对分叉点和终止点的每个点,我使用meshgrid来确定围绕每个相关像素的5 x 5点网格,然后为5 x 5网格中的每个点生成线性索引。然后我将它添加到一个最终数组中,以便我们可以执行上面看到的相同标记逻辑。

如果您希望它们不是红色和绿色,那么您必须使用颜色,但这应该是您可以开始使用的。如果你想要一个RGB模型的可能颜色列表,一个很好的工具是RGB colour picker,你可以找出你想要的颜色,它会给你RGB值来复制那个颜色。

祝你好运!