2016-04-08 6 views
-1

Ich habe ein binäres Bild der Hand wie folgt aus:Erfassen Finger Täler mit Matlab

hand binary image

Ich habe ein Matlab-Funktion zu schreiben, die das Tal zwischen zwei Fingern erfaßt. Die Parameter sind das Binärbild und die Koordinaten der beiden Fingerspitzen.

Ich bin neu in der Bildverarbeitung und ich weiß nicht, wie ich anfangen soll.

+1

Es gibt so viele Ansätze. Sie könnten versuchen, einige mit Google zu finden und dann spezifischere Fragen stellen. – RobAu

+0

Ich kenne die Stelle eines Punktes im schwarzen Bereich zwischen den beiden Fingern. Meine Idee war, mit diesem Punkt zu beginnen und das Tal zu durchsuchen (der Suchbereich ist durch weiße Pixel und durch die X-Koordinate der beiden Fingerspitzen begrenzt). Aber ich weiß nicht wie ich den Talpunkt suchen kann. –

+0

Schauen Sie in: "Konvexitätsdefekte", das ist eine Methode, die typischerweise verwendet wird, wenn man mit dieser Art von Handbildern arbeitet. – RobAu

Antwort

1

Ich empfehle, den schwarzen Bereich zwischen den beiden Eingabepunkten zu isolieren und dann den höchsten Punkt in dieser verbundenen Komponente zu finden. Sie können den folgenden Ansatz versuchen (Sie müssen möglicherweise einige der Parameter optimieren, aber es sollte ein guter Anfang sein).

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); 

* Zuglinie Funktion wird aus drawline webpage genommen.

Endergebnis (Eingabepunkte in rot, Ausgabepunkt in blau). enter image description here

-1

Es ist nur der Algorithmus, aber alle diese Funktion gibt es sicherlich in Matlab:

  1. Compute die konvexe Hülle
  2. Berechne die Differenz: Convex Hull minus die ursprüngliche Form zurück. Dann haben Sie alle Täler, die Sie suchen, plus einige kleine Muster.
  3. Kennzeichnung der angeschlossenen Komponenten.
  4. Löschen Sie die kleinen Komponenten. Dann hast du alle Täler zwischen den Fingern.
  5. Dann können Sie mit den Fingerspitzenkoordinaten die gewünschte auswählen.