Combien de formes sont dans cette image?

10

Les enfants savent très bien classer les objets et les compter. Les ordinateurs semblent avoir plus de mal. Il s'agit d'une version simplifiée de ce problème. Pouvez-vous écrire un petit programme qui peut classer et compter des objets dans une image?

Le problème: étant donné une image contenant un ou plusieurs cercles et rectangles, retournez 2 entiers avec le nombre de cercles et le nombre de rectangles.

Règles

  • L'image d'entrée sera des figures noires sur fond blanc dans n'importe quel format bitmap que vous choisissez.
  • La largeur et la hauteur de l'image seront comprises entre 100 et 1000 pixels.
  • Les figures seront entièrement contenues dans l'image.
  • Les figures auront une largeur de ligne de 1 pixel.
  • Les images n'utiliseront pas d'anticrénelage. Ils seront en noir sur blanc uniquement.
  • Les figurines peuvent toucher, se croiser ou se trouver à l'intérieur d'une autre figurine.
  • Les figures qui se croisent auront un maximum de 4 pixels communs.
  • Les cercles auront un diamètre de 20 pixels ou plus.
  • Les côtés du rectangle auront une longueur de 10 pixels ou plus.
  • Vous ne pouvez pas utiliser de modules intégrés ou de bibliothèques qui reconnaissent les formes, ou toute autre fonction qui rend ce défi trivial.
  • Renvoie ou imprime 2 entiers avec le nombre de cercles et de rectangles.

Exemple 1

Exemple 1

Réponse: 3 4

Exemple 2:

entrez la description de l'image ici

Réponse: 4 13

Il s'agit d'un défi de golf de code, donc le programme ou la fonction la plus courte dans chaque langue gagnera.

Logic Knight
la source
Je peux déjà le dire, compter les rectangles, c'est compter les coins, mais les cercles seront beaucoup plus difficiles.
Bálint

Réponses:

3

PHP - 355 octets

Le nombre d'octets ne comprend pas '<image-url>'.

<?php
m('<image-url>');function m($f){$i=imagecreatefrompng($f);$r=f($i,17);$c=f($i,9);echo($c-$r).' '.$r."\n";}function f($i,$k){$w=imagesx($i);$h=imagesy($i);$r=0;for($y=0;$y<$h;$y++)for($x=0;$x<$w;$x++)if(!imagecolorat($i,$x,$y))$r+=g($i,$x,$y,$w,$k);return$r;}function g($i,&$x,$y,$w,$k){$l=$x;while(!imagecolorat($i,$x,$y)&&$x<$w)$x++;return($x-$l>$k)?1/2:0;}

Dans les deux cas de test, les URL que j'ai utilisées sont http://i.stack.imgur.com/qnIFk.pnget http://i.stack.imgur.com/HV9k3.png.

Compte les lignes horizontales et divise par deux pour obtenir le nombre de formes. Se fonde sur l'observation selon laquelle les cercles ont des segments horizontaux plus courts et les rectangles ont des segments horizontaux plus longs.

Hack admis, pas garanti de fonctionner pour autre chose que les cas de test!

J'ai essayé de faire pivoter les images de ± 45 ° et de détecter les lignes horizontales. Cela reviendrait à vérifier les lignes diagonales et à mieux saisir les cercles, mais je n'ai pas trouvé d'algorithme d'interpolation qui laisse suffisamment de bords propres pour fonctionner. Par exemple, ils peuvent tacher une ligne en deux rangées de pixels et gâcher le compte.


la source