2012-03-31 5 views
3

Hier ist ein Bild:Gebiet Segmentierung innerhalb eines segmentierten Bereichs

enter image description here

Ich mag würde wissen, wie ich den schwarzen Kreis auf Weiß und den Rest auf Schwarz gesetzt werden.

(So segmentieren Sie den schwarzen Kreis innerhalb des weißen Bereichs).

Ich weiß, ich kann das Bild invertieren und der Kreis wird weiß sein ... aber so wird der gesamte schwarze Teil, der in diesem Bild zu sehen ist.

Wenn ich das in Matlab tun müsste, würde ich eine verbundene Komponentenoperation durchführen und die Zirkularität der BLOBs überprüfen. Obwohl ich dies in opencv tun muss (javacv um genau zu sein.)

Gibt es eine einfache Möglichkeit, dies in opencv (javacv) zu tun.

Thx im Voraus

Antwort

2

Es gibt einen einfachen Weg in OpenCV mit findContours() und drawContours(). Wenn Sie die hierarchische Version von findContours() verwenden, können Sie dann die Hierarchie durchsuchen und nur die untergeordnete Kontur des weißen Quads zeichnen (füllen). Dies hat den zusätzlichen Vorteil, dass Sie bei Bedarf einige Plausibilitätsprüfungen durchführen können (z. B. Überprüfen der Größe der Kontur, um zu sehen, ob sie ungefähr der erwarteten Größe entspricht). Ich weiß nichts über Java oder JavaCV, aber vielleicht können Sie das C++ - Beispiel für Findcontours, die in opencv enthalten sind, als Inspiration betrachten?

0

Sie können mit OpenCV Bibliothek Bildobjekte auf Bildern erkennen (über Java-Adapter); Dafür musst du ein Netzwerk für Kreise ausbilden.

In Bezug auf genau Ihren Fall (wahrscheinlich diese Lösung nicht allgemein sein) können Sie Ihr Bild auf Segmente aufteilen und die Verwendung als Bedingung - Farbwechsel, Pseudo-Code siehe unten:

//build color switching list 
List<Point> colorSwitches = ... 
for(each horizontal line from image){ 
    for(each pixel from line){ 
     if(color of previous pixel != color of current pixel){ 
      colorSwitches.add(currentPoint) 
     } 
    }  
} 
// so, you have detected margins of your image objects; now we need to merge neighbor pixels into image objects, where image object is collection of margin points(you should create this class) 
List<ImageObject> imageObjects = ... 
for(each color switch){ 
    if(current pixel is connected with pixels from existing image objects){ 
     // returns image object neared with current point 
     getRelatedImageObject(imageObjects).add(currentPoint); 
    }else{ 
     imageObjects.add(new ImageObject(currentPixel)); 
    } 
} 
// now we have list of objects from image, and we need to match objects 

Ok, seine allgemeinen Linien wie Sie tun können, was Sie brauchen, wenn Sie genauer brauchen, werde ich versuchen, detaillierter zu erklären. Auch Sie können mich direkt kontaktieren

Ich hoffe, es wird Ihnen helfen.