2016-05-22 7 views
9

Ich bin auf der Suche nach einer guten Möglichkeit, eine Luftblase aus dem folgenden Bild zu isolieren. Ich verwende Visual Studio 2015 und C#.Algorithmus zur Bestimmung der Größe von Luftblasen aus Bild

Ich habe von der Wasserscheide-Methode gehört und glaube, dass es eine gute Lösung sein kann.

Ich habe versucht, den Code Lösung hier gefunden Umsetzung: watershed image segmentation

Ich hatte nicht viel Erfolg. Die Lösung hat Probleme, Funktionen zu finden, zum Beispiel: FilterGrayToGray.

Kennt jemand eine gute Möglichkeit, dies zu tun?

Example of Image

+1

haben Sie versucht OpenCV (oder Emgu CV für .Net ... C#)? vielleicht einige binäre Filter mit einem Blob-Detektor verwenden sollte genug sein, um zumindest Ihre Blasen zu erkennen ... –

+0

Also habe ich einen anderen Algorithmus, der OpenCV benötigt, aber alle Versionen von Bibliotheken Open CV verfügbar NuGet funktioniert nicht. – Toster

+1

Es gab eine [Herausforderung] (http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice) auf Codegolf, wenn das hilft. Mit einem [C#] (http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice) antworte – CSharpie

Antwort

4

Sie sollten nur ein Neural network trainieren, um Teile des Bildes zu erkennen, wenn keine Blasen vorhanden sind (in Beispielgruppen von 16x16 Pixeln). Wenn dann ein Quadrat nicht erfolgreich erkannt wird, führen Sie einen Burst horizontaler Scanlinien aus, und Sie registrieren, wo die Kante beginnt und endet. Sie können ziemlich genau den Abschnitt einer Blase bestimmen (aber bestimmen Sie sein Volumen, um die Oberflächenkrümmung zu berücksichtigen, die möglich aber härter ist) auf dem Bild. Wenn Sie die Möglichkeit haben, mehr Kameras zu verwenden, können Sie mehr Abschnitte einer Blase triangulieren und eine genaue Vorstellung von der tatsächlichen Lautstärke erhalten. Als weitere euristic zu wissen Blase Größe können Sie auch die bekannten Volumendurchsatz, so dass Sie wissen, wenn Sie in einem Zeitintervall X Liter Luft emittiert haben, und die Blasen haben Abschnitte in einem bestimmten Verhältnis gegeben Sie können das Gesamtvolumen über Blasen und verteilen weitere Erhöhung der Präzision (natürlich muss man den Druck im Auge behalten, da die Blasen am Boden des Pools kleiner sind).

Show different images tweaked

Wie Sie sehen Sie mit einfachen Algorithmen wie Gaußsche Unterschied und Kontrast spielen können unterschiedliche Qualität der Ergebnisse zu erzielen.

  • Im linken Bild können Sie leicht alle Hintergrundgeräusche entfernen, jedoch haben Sie jetzt einen Teil der Blasen verloren. Es ist möglich, dass Sie die verpasste Blasenkante wiedererlangen können, indem Sie eine andere Beleuchtung im Pool verwenden.
  • Im rechten Bild haben Sie die ganzen Bubbles Kanten, aber jetzt haben Sie auch mehr Bereiche, die Sie manuell aus dem Bild verwerfen müssen.
  • Wie für Kantenerkennung Algorithmus sollten Sie einen Algorithmus verwenden, die nicht einen festen Offset zu Kanten hinzufügen (wie Faltungsmatrix oder Laplace), ich denke, Gaussian Unterschied würde am besten funktionieren.

    Behalten Sie alle Zwischendaten bei, damit Sie den Algorithmus leicht überprüfen und optimieren und seine Genauigkeit erhöhen können.

    EDIT:

    Der Code ist abhängig von Wich Bibliothek, die Sie verwenden, können Sie leicht Gaussian Blur und horizontale Scanline, für Neuronale Netze gibt es bereits C# Lösungen gibt implementieren.

    // Do gaussian difference 
    Image ComputeGaussianDifference (Image img, float r1, float r2){ 
        Image img = img.GaussianBlur(r1); 
        Image img2 = img.GaussianBlur(r2); 
        return (img-img2).Normalize(); // make values more noticeable 
    } 
    

    mehr Bearbeitungen anhängige .. versuchen, sich in der Zwischenzeit dokumentieren Sie, ich habe bereits genug Spur gegeben Ihnen die Arbeit abnehmen zu lassen, müssen Sie nur grundlegendes Verständnis von einfachen Bildverarbeitungsalgorithmen und die Verwendung von neuronalen Netzen bereit.

    +0

    Als Kantenerkennung benutze was scheinbar besser funktioniert, da es etwas Rauschen (Wellen, Lichtreflexion) gibt) wahrscheinlich ist das beste Ding, nur gaussian Unterschied zu versuchen und es manuell zu justieren, um nur Ränder der Luftblasen zu sehen. – GameDeveloper

    +1

    Neuronales Netzwerk ist notwendig, da es offenkundige Nicht-Blasen-Kanten (Kante des Pools, eine helle Hervorhebung) gibt. Diese sollten manuell deaktivierte Bereiche oder von NN verworfene Bereiche sein. Natürlich wäre der bessere Weg, die Kamera so zu positionieren, dass nur ein monochromer blauer Hintergrund entsteht, der die Anforderung für ein NN beseitigen würde. – GameDeveloper

    +0

    Können Sie eine Beispielcode für diese Lösung geben? Ich hatte ein Problem mit den Implikationslösungen das gleiche Problem, das ich in C# lösen musste und ich bin mehr Benutzer Delphi. – Toster

    1

    Um Lösungen in den Sinn kommen:

    Lösung 1:

    Verwenden Sie die Hough transform for circles.

    Lösung 2:

    In der Vergangenheit hatte ich auch eine Menge Ärger mit ähnlichen Aufgaben Segmentierung Bild. Im Grunde endete ich mit einer Flutfüllung, die dem von Ihnen programmierten Watershed-Algorithmus ähnelt.

    Einige Hut Tricks, die ich würde hier versuchen:

    • das Bild verkleinern.
    • Verwenden Sie Farben. Ich bemerke, dass du alles nur grau machst; das macht wenig Sinn, wenn Sie einen dunkelblauen Hintergrund und schwarze Ränder haben.
    2

    Nur für den Fall, wenn Sie nach etwas Spaß suchen - Sie könnten Application Example: Photo OCR untersuchen. Grundsätzlich trainierst du einen NN, um eine Blase zu erkennen, und probierst es auf einem Schiebefenster über das Bild. Wenn Sie eine erfassen, verwenden Sie eine andere NN, die darauf trainiert ist, die Blasengröße oder das Volumen zu schätzen (Sie können wahrscheinlich Ihren Luftstrom messen, um die NN zu trainieren). Es ist nicht so schwer wie es klingt und bietet eine sehr hohe Präzision und Anpassungsfähigkeit.

    P.S. Azure ML sieht gut aus, als eine freie Quelle für all die Schnickschnack, ohne dass man tief gehen muss.

    1

    Möchten Sie die Luftblase in einem einzigen Bild isolieren oder die gleiche Luftblase aus einem Bildstrom verfolgen?

    Um eine "Blase" zu isolieren, versuchen Sie es mit einer Faltungsmatrix auf dem Bild, um die Kanten zu erkennen. Sie sollten die Kantenerfassungsfaltung basierend auf der Art des Bildes auswählen. Hier ist ein Beispiel für eine Laplace-Kantenerkennung, die in Gimp gemacht wurde, jedoch ist es einfach, sie in Code zu implementieren.

    Laplace edge detection

    Dies kann bei der Isolierung der Ränder der Blasen helfen.

    Wenn Sie die gleiche Blase aus einem Stream verfolgen, ist dies schwieriger aufgrund der Art und Weise, wie sich die Blasen beim Durchfluss durch die Flüssigkeit verformen. Wenn die Bildrate hoch genug ist, wäre es leicht, den Unterschied von Bild zu Bild zu sehen, und Sie können beurteilen, welche Blase wahrscheinlich ist (basierend auf der Positionsdifferenz). Das heißt, Sie müssten den aktuellen Frame mit dem vorherigen Frame vergleichen und mit etwas Intelligenz versuchen herauszufinden, welche Bubble von Frame zu Frame gleich ist. Ein Referenzpunkt zu verwenden, um einen Bezugspunkt zu geben, wäre ebenfalls nützlich. Die Düse am unteren Rand des Bildes könnte eine gute sein, da Sie eine Signatur dafür erzeugen können (die Düse ändert ihre Form nicht!) Und überprüfen Sie dies jedes Mal. Signaturen für die Bubbles werden nicht viel helfen, da sie sich drastisch von einem Bild zum nächsten ändern könnten. Stattdessen würden Sie Blobs und ihre wahrscheinliche Position im Bild von einem Frame zum nächsten verarbeiten.

    For more information on how convolution matrices work see here.

    For more information on edge detection see here.

    hoffe, das hilft, viel Glück.

    Verwandte Themen