Comptage d'oiseaux


Je propose un programme qui compte presque automatiquement les oiseaux sur une photo numérique.

En voici un aperçu (le nombre d'oiseaux calculé est en bas à droite : 310)
         Essayer la démo en ligne

Pour les cas difficiles, un programme de comptage manuel est également disponible :
         Voir le programme de comptage manuel

 

 

Vol de cigognes

Fonctionnement

Après avoir chargé la photo jpg (800x600 pixels maxi), on noircit les oiseaux pour mieux les distinguer du ciel,
puis le logiciel compte les oiseaux, et il met en évidence les plus gros qui risquent fort d'être des groupes de 2 oiseaux ou plus.
Il vous reste alors à préciser ceux qui sont des groupes de 3 ou 4.

 

Utilisation du logiciel

1. Séparer les oiseaux du ciel

Pour aider le logiciel à distinguer les oiseaux du ciel, faites glisser (bouton gauche enfoncé) 3 morceaux d'oiseau et 3 morceaux de ciel dans l'une des 6 cases. Si vous avez mal visé, vous pouvez rectifier en cliquant sur une autre pixel que le pixel entral.
Une petite aide vous le rappelle si vous laissez la souris sur cette partie d'écran.

Quand vous êtes satisfait, cliquez sur Séparer les oiseaux. Les oiseaux deviennent plus noirs.

Vous pouvez encore rectifier. Vous pouvez aussi :

Voir/enlever le noir : enlever ou remettre le noir des oiseaux pour apprécier la qualité de la séparation et évetuellment choisir d'autres échantillons.

Sauver bmp : enregistrer sur disque le fichier bmp des oiseaux en noir et ciel en blanc si on veut sauter l'étapde de séparation une fois avec la même photo.

Charger bmp : charger le fichier bmp déjà enregistré.

Réinitialiser : charger l'échantillon de 6 cases livré avec le logiciel et qui est une bonne base de départ pour la plupart des photos.
Le programme démmarre toujours avec le dernier échantillon utilisé.

 

Laisser le seuil auto par défaut ; c'est le nombre de pixels à partir duquel on doit considérer qu'un bloc est constitué de 2 oiseaux. (il est égal à 1,5 fois la taille qu'on rencontre le plus)

2. Choix du seuil

Le graphique à droite montre le nombre de groupes d'oiseaux pour chaque taille en pixels. Le nouveau seuil à choisir correspond souvent à l'endroit où la courbe devient plus horizontale : cliquer pour voir la taille correspondante (ici : 28), ce nombre se reporte tout seul dans la case Seuil, puis cliquer sur Compter les oiseaux.
En mettant un peu moins, on aura quelques oiseaux seuls comptés comme 2, mais ça compensera peut-être les groupes de 3 comptés comme groupes de 2, et on aura tout de suite une bonne approximation (mais ça fait plus de rectangles à déplacer). Faites plusieurs essais. Dans l'exemple du vol de cigognes, le seuil de 26 était un bon choix : la plupart des blocs encadrés contiennent 2 oiseaux ou plus. Le programme compte alors 228 oiseaux seuls et 46 blocs de 2, soit un total de 320 .

3. Affinage : correction des erreurs du logiciel

Les rectangles blancs sont considérés comme des groupes de 2 oiseaux. On peut corriger en les déplaçant en bas sous la photo, dans la case (ou cage) voulue ; par exemple en déplaçant un groupe de 4 en bas, le total passe à 322. Les blocs de 1 ou 2 pixels ne sont pas pris en compte. Pour y voir plus clair, on peut aussi glisser les blocs de 2 en bas, mais ça ne change rien au comptage. Exceptionnellement, on peut avoir besoin de signaler qu'un oiseau considéré comme seul est en fait un groupe de 2 (clic droit).

Limites du programme au 10-06-09

Taille de l'image : 800x600
Taille d'un groupe d'oiseaux : 400 pixels
Nombre de groupes : 2000

Démonstratation en ligne

Essayer la démo en ligne

Avec Firefox, il faudra peut-être recharger la page (ou réactualiser, touche F5) pour pouvoir déplacer les rectangles en bas.

Téléchargement

Comptage-oiseaux.zip (341 Ko) version 2 du 29-06-09 :on peut maintenant séparer les oiseaux et le ciel sans passer par un logiciel de retouche d'images.

vol de cigognes.jpg (57 Ko), photo Vincent Palomares, www.ornithomedia.com/pratique/conseils/conseil_art37_2.htm

 

 

Pour signaler des problèmes ou suggérer des améliorations :

aller sur la page Contacts

 

Annexe 1 : L'algorithme : méthode utilisée pour détecter un oiseau dans le fichier bmp

startExpandCollapse id="expand2" title="Voir/Cacher l'algorithme"

1. Origine du projet

Le programme comptage.exe a été réalisé en Delphi (langage équivalent au C++)

L'idée m'est venue en novembre 2005, dans le pays basque, lorsque j'entendais à la radio les comptages quotidienns de palombes. Après renseignements, je me suis rendu compte que le comtage était toujours visuel et approximatif.

Professeur de maths et informatique en classe prépa (Lycée Saint-Joseph, la Roche sur Yon), je me suis lancé dans un projet de comptage automatique sur une photo numérique simplifiée avec mes élèves, avec le logiciel de calcul formel Maple. Actuellement en retraite, j'ai aménagé avec Delphi la partie ergonomique qui vise à corriger manuellement les erreurs du logiciel (nombre d'oiseaux par groupe de pixels)

2. L'algorithme (proposé à mes élèves de prépa)

On se balade dans l'image ligne par ligne. Dès qu'on touche un oiseau (en x=j0,y=i0 ), on appelle une procédure teste_ligne(j0,i0) qui doit compter et effacer tous les point noirs qui font partie du même oiseau.

D'abord on compte et efface les points noirs sur la ligne i0, à partir de j0.
Pour réutiliser facilement la procédure pour les lignes suivantes, on commencera par chercher en reculant, l'abscisse j1 du premier point de l'oiseau sur la ligne, et j2 l'abscisse du dernier point.
Puis on passe à la ligne du dessous (i0+1), et on teste les points de j1-1à j2+1.
Si on trouve un point noir, on appelle teste_ligne(..., ...) pour ce point. (la procédure teste_ligne s‘appelle donc elle-même: c'est une procédure récursive)

Difficulté supplémentaire (à laisser de côté dans un premier temps): il se peut que, une fois sur la 2ème ou 3ème ligne, on trouve un bout d'oiseau plus loin (ou avant) sur la ligne précédente: pour chaque ligne d'oiseau, il faut donc regarder la ligne en dessous et la ligne au-dessus.

Exemple: début d'oiseau (en vert) en i0=2, j0=4.
0n fait teste_ligne(4,2), puis teste_ligne(3,3) et teste_ligne(10,2)

3. code résumé de la procédure teste_ligne

startExpandCollapse id="expand3" title="Voir/Cacher la procédure teste_ligne"

procedure teste_ligne(j0,i0:integer) ; // teste vers la droite à partir de (j0,i0)
var j,j1,j2: integer;trouve:boolean;
begin

j:=j0;trouve:=false; 

if j0xmax then xmax:=j0; if i0ymax then ymax:=i0;

while (j<largeur) and="" (a[j,i0]="255)" do="" begin<="" span="">

a[j,i0]:=0; // pour ne pas retomber dessus ensuite
trouve:=true;
if j>xmax then xmax:=j;
taille:=taille+1; j:=j+1;
end;

j2:=j; j:=j0-1;

while (j>=0) and (a[j,i0]=255) do begin // il faut aussi regarder en arrière (si on est descendu d'une ligne)
a[j,i0]:=0; trouve:=true;
if j taille:=taille+1; j:=j-1;
end;

j1:=j;if j1<=0 then j1:=0;

if j2>largeur then j2:=largeur;

if trouve then

for j:=j1 to j2 do begin
if (i0>=0) and (a[j,i0-1]=255) then teste_ligne(j,i0-1);
if (i0<hauteur) and="" (a[j,i0+1]="255)" then="" teste_ligne(j,i0+1);="" <br=""> end;
end; // fin de la procédure</hauteur)>

</largeur)>

Et maintenant la procédure appelée lorsqu'on clique sur le bouton Compter les oiseaux :

procedure Tcmptage.ComptageClick(Sender: TObject);
begin
seuil:=strtoint(edit_seuil.Text);
hauteur:=bmp
.Height;
largeur:=bmp
.Width;
remplit_table(largeur,hauteur); // copie de l'image dans le tableau a
n:=0; // nombre d'oiseaux
// on se balade dans le tableau à la recherche de débuts d'oiseaux
for i0:= 0 to hauteur-1 do
for j0:= 0 to largeur-1 do
if (a[j0,i0]=255) then begin // 255: noir, 0: blanc
taille:=0; //taille de l'oiseau en pixels
xmin:=largeur; xmax:=0; ymin:=hauteur; ymax:=0; //rectangle contenant l'oiseau
teste_ligne(j0,i0);
if taille>2 then begin // les blocs de 1 ou 2 pixels ne sont pas pris en compte
n:=n+1;
tailles[n]:= taille;
rect[n].Left:=xmin-1; rect[n].Top:=ymin-1; //coordonnées du rectangle entourant l'oiseau
rect[n].Right:=xmax+1; rect[n].Bottom:=ymax+1;
end;
end;
// fin de if (a[j0,i0]=255)
affiche_rectangles; // pour les oiseaux doubles sur la photo jpg
graphique_tailles(); // affichage du graphique
end; // fin de la procédure comptage

stopExpandCollapse

 

stopExpandCollapse