Question

J'ai donc un tableau à 2 dimensions représentant un plan de coordonnées, une image. Sur cette image, je suis à la recherche pour les pixels « rouges » et de trouver (je l'espère) l'emplacement d'une cible de LED rouge en fonction de tous les pixels rouges trouvés par mon appareil photo. À l'heure actuelle, je suis tout simplement giflé mes ligne de mire sur le barycentre de tous les pixels rouges:

// 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

Le problème avec cette méthode est que si cet algorithme met naturellement le centre de gravité plus proche de la plus grande blob (la région avec le plus de pixels rouges), je vois encore mes réticules sauter de la cible quand un peu de scintille rouge au large de le côté en raison de l'éblouissement ou d'autres interférences mineures.

Ma question est la suivante:

Comment puis-je modifier ce modèle pour trouver un plus pondéré barycentre? Mettez simplement, je veux faire les blobs plus grands de rouge beaucoup plus importantes que les plus petites, peut-être même en ignorant far-out petits blobs tout à fait.

Était-ce utile?

La solution

You could find the connected components in the image and only include those components that have a total size above a certain threshold in your centroid calcuation.

Autres conseils

I think the easiest (and maybe naïve) answer would be: instead of counting just the pixel value, count also the surrounding 8 pixels (in a total of 9). Now, each value took can be from 0 to 9, and includes greater values for blobs with the same color. Now, instead of vals++ you'll be incrementing the value by the number of pixels in the surrounding area too.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top