2015-04-06 22 views
5

Ich habe eine Reihe von diskreten Punkten in einem Bild dargestellt, wie die folgenden discrete maskopencv finden konkaver Rumpf

ich rekonstruieren will oder Upsampling (Ich bin nicht sicher, was der richtige Weg ist, um es zu beschreiben) die Bild, so dass das Ergebnisbild wäre wie folgt after-processed mask. Es muss nicht genau dasselbe wie das Beispielbild sein, aber die Hauptidee besteht darin, das Originalbild zu füllen.

Ich habe eine erste Idee, wie es geht. Aber ich weiß nicht, wie ich es nach dem ersten Schritt machen soll. Meine Idee ist es, das Bild zuerst mit Kmeans zu trennen und die verschiedenen Objekte herauszufinden. Und ich habe es erfolgreich gemacht. Die resultierenden Bilder nach KMeans sind: object 1 maskobject 2object 3 mask.

Nach KMeans, ich möchte Kontur finden oder etwas wie konkav, um den Umriss dieser Formen zu bekommen und füllen Sie die Form mit Funktionen wie Fülllöcher. Allerdings finde ich "find contour" funktioniert nicht, es wird jedes einzelne Pixel als Kontur betrachten.

Der andere Weg, den ich denke, ist die Verwendung von Interpolation. Aber ich bin mir nicht sicher, ob das mit so spärlichen Punkten möglich ist. Hat jemand irgendwelche Ideen, wie man das macht? Ich bin mir nicht sicher, ob ich auf dem richtigen Weg bin und bin offen für jede Lösung.

Vielen Dank!

+1

Ich glaube nicht, "Upsampling" ist der Begriff, die Sie suchen. –

+0

@MarkRansom Ja, ich bin mir nicht sicher, was der richtige Ausdruck ist. Irgendwelche Vorschläge? – user1964417

Antwort

1

Werfen Sie einen Blick auf die morphologischen Transformationen. Ich würde mit einer Dilatationsoperation beginnen, die einen großen Kernel verwendet, sagen wir MORPH_ELLIPSE mit einer Größe (15,15). Danach verdünnen Sie die Blobs mithilfe der Erosionsoperation mit dem Kernel derselben Größe. Werfen Sie einen Blick auf die Dokumentation here. Beachten Sie, dass OpenCV auch verkettete oder sequenzierte morphologische Operationen bietet. Siehe here. Sie werden dann sehen, dass mein Vorschlag eine "Closing" -Operation ist.

Update: Ich experimentierte mit einfachen Dilatation und Konturierung, um die Ergebnisse im Bild gezeigt. Die Ergebnisse scheinen die allgemeinen Anforderungen des Problems zu erfüllen.

In ähnlicher Weise, was "Echtzeit" bedeutet für die Anwendung ist nicht angegeben, aber diese Reihe von Operationen können schnell ausgeführt werden und könnte leicht auf eine 30fps-Anwendung angewendet werden. Contoured image

-Code-Snippet:

// Convert image to grayscale 
cvtColor(src, gray, CV_BGR2GRAY); 
threshold(gray, gray, 128.0, 128.0, THRESH_BINARY); 

// Dilate to fill holes 
dilate(gray, dest, getStructuringElement(MORPH_ELLIPSE, Size(13,13))); 

// Find contours 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
findContours(dest, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0)); 

    // Prune contours 
    float maxArea = 0.0f; 
    for (size_t i = 0; i< contours.size(); i++) 
    { 
     if (contourArea(contours[i]) >= maxArea) 
     { 
      maxArea = contourArea(contours[i]); 
     } 
    } 

    float minArea = 0.20f * maxArea; 
    vector<vector<Point> > prunedContours; 
    for (size_t i = 0; i< contours.size(); i++) 
    { 
     if (contourArea(contours[i]) >= minArea) 
     { 
      prunedContours.push_back(contours[i]); 
     } 
    } 

// Smooth the contours 
vector<vector<Point> > smoothedContours; 
    smoothedContours.resize(prunedContours.size()); 
    for (size_t i=0;i<prunedContours.size();i++) 
    { 
    vector<float> x; 
    vector<float> y; 

    const size_t n = prunedContours[i].size(); 

    for (size_t j=0;j<n;j++) 
     { 
     x.push_back(prunedContours[i][j].x); 
     y.push_back(prunedContours[i][j].y); 
     } 

    Mat G; 
    transpose(getGaussianKernel(11,4.0,CV_32FC1),G); 

    vector<float> xSmooth; 
    vector<float> ySmooth; 

    filter2D(x,xSmooth, CV_32FC1, G); 
    filter2D(y,ySmooth, CV_32FC1, G); 

    for (size_t j=0;j<n;j++) 
     { 
     smoothedContours[i].push_back(Point2f(xSmooth[j],ySmooth[j])); 
     } 
    } 
+0

Ich habe aber über Morphologie. Aber diese Methode ist nicht stabil, wenn wir verschiedene Objekte haben und dies nicht in Echtzeit tun können. – user1964417

+0

Zwei Kommentare: Die obigen Morph-Operationen sind ziemlich schnell und können wahrscheinlich in GPU beschleunigt werden (abhängig von der Plattform). Kannst du "nicht stabil" klären? Dies führt zu einer weiteren Einschränkung Ihres Problems, da Morph-Operationen normalerweise als stabil betrachtet werden (in dem Sinne, dass sie ohne große Überraschungsmöglichkeit funktionieren). – Throwback1986

+0

Was ich mit nicht stabil meinen kann, hängt davon ab, welches Objekt Sie verwenden und wie die verschiedenen Objekte aussehen mögen. Mein System muss in Echtzeit arbeiten, egal welches Objekt es ist, es muss getan werden, ohne die Parameter für die Morphologie anzupassen. – user1964417