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).
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.
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 ... –
Also habe ich einen anderen Algorithmus, der OpenCV benötigt, aber alle Versionen von Bibliotheken Open CV verfügbar NuGet funktioniert nicht. – Toster
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