用Matlab检测手指谷

时间:2016-04-08 12:11:45

标签: matlab image-processing biometrics

我有一个手的二进制图像:

hand binary image

我必须编写一个Matlab函数来检测两个手指之间的波谷。 参数是二进制图像和两个手指尖的坐标。

我是图像处理的新手,我不知道如何开始。

2 个答案:

答案 0 :(得分:1)

我建议隔离两个输入点之间的黑色区域,然后找到此连接组件中的最高点。 您可以尝试以下方法(您可能需要调整一些参数,但它应该是一个良好的开端)。

I = rgb2gray(imread('<your path>'));

%input parameters - points which represents two finger tips.
x1 = 408; y1 = 441;
x2 = 454; y2 = 373;

%binarize image  
I = im2bw(I);

%noise reduction - close holes
I2 = imclose(I,strel('disk',10));

%draw a line between p1 and p2
ind = drawline([y1 x1],[y2 x2],size(I));
lineMat = zeros(size(I));
lineMat(ind) = 1;

%adds the line to the image
I2 = I2 | lineMat;

%finds a point in the middle of the line
[lineY, lineX] = ind2sub(size(I),ind);
midX = lineX(ceil(length(ind)/2));
midY = lineY(ceil(length(ind)/2));

%finds a point which resides in the connected component which is between
%the line and the two finger. 
xSeed = midX;
ySeed = midY -5;

%perform imfill operation, starting from (xSeed,ySeed),
%in order to find the conected component in which the point (xSeed,ySeed)
%resides.
diffMat = imfill(I2,[ySeed xSeed])~=I2;

%finding the highest point in this connected component
[Y, X] = ind2sub(size(diffMat),find(diffMat));
minInd = find(Y==min(Y),1,'first');
yValley = Y(minInd);
xValley = X(minInd);

%presents result
imshow(I);hold on;
plot(x1,y1,'r.','MarkerSize',20);
plot(x2,y2,'r.','MarkerSize',20);
plot(xValley,yValley,'b.','MarkerSize',20);

*绘制线功能取自drawline webpage

最终结果(输入点为红色,输出点为蓝色)。 enter image description here

答案 1 :(得分:-1)

这只是算法,但所有这些功能肯定存在于MatLab中:

  1. 计算凸包
  2. 计算差异:凸壳减去原始形状。然后你就拥有了你想要的所有山谷,还有一些小样子。
  3. 连接组件标签。
  4. 删除小组件。然后你手指间的所有山谷。
  5. 然后你可以用指尖坐标选择你想要的那个。