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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top