Gewichtete Schwerpunkt eines Arrays
-
27-10-2019 - |
Frage
Ich habe also ein zweidimensionales Array, das eine Koordinatenebene darstellt, ein Bild. Auf diesem Bild suche ich nach "roten" Pixeln und finde (hoffentlich) den Ort eines roten LED -Ziels basierend auf allen von meiner Kamera gefundenen roten Pixeln. Derzeit schlage ich einfach mein Fadenkreuz auf den Schwerpunkt aller roten Pixel:
// pseudo-code
for(cycle_through_pixels)
{
if( is_red(pixel[x][y]) )
{
vals++; // total number of red pixels
cx+=x; // sum the x's
cy+=y; // sum the y's
}
}
cx/=vals; // divide by total to get average x
cy/=vals; // divide by total to get average y
draw_crosshairs_at(pixel[cx][cy]); // found the centroid
Das Problem mit dieser Methode ist, dass dieser Algorithmus zwar den Schwerpunkt näher am größten Blob (den Bereich mit den roten Pixeln) nähert zu schauen oder andere kleinere Störungen.
Meine Frage ist:
Wie verändere ich dieses Muster, um nach einem mehr zu suchen? gewichtet Schwerpunkt? Einfach ausgedrückt, ich möchte die größeren Rotkolben viel wichtiger machen als die kleineren, und möglicherweise sogar ignoriere sogar weitaus kleine Blobs insgesamt.
Lösung
Sie könnten das finden verbundene Komponenten In dem Bild und nur die Komponenten mit einer Gesamtgröße über einem bestimmten Schwellenwert in Ihrer Zentroid -Berechnung einbeziehen.
Andere Tipps
Ich denke, die einfachste (und vielleicht naive) Antwort wäre: Anstatt nur den Pixelwert zu zählen, zählen Sie auch die umgebenden 8 Pixel (in insgesamt 9). Jetzt kann jeder Wert von 0 bis 9 liegen und umfasst größere Werte für Blobs mit derselben Farbe. Jetzt statt von vals++
Sie werden den Wert auch nach der Anzahl der Pixel in der Umgebung inkrementiert.