Quante forme ci sono in questa immagine?


10

I bambini sono molto bravi a classificare gli oggetti e contarli. I computer sembrano avere più problemi. Questa è una versione semplificata di questo problema. Puoi scrivere un piccolo programma in grado di classificare e contare gli oggetti in un'immagine?

Il problema: data un'immagine contenente uno o più cerchi e rettangoli, restituisci 2 numeri interi con il conteggio dei cerchi e il conteggio dei rettangoli.

Regole

  • L'immagine di input sarà rappresentata da figure nere su uno sfondo bianco in qualsiasi formato bitmap scelto.
  • La larghezza e l'altezza dell'immagine saranno comprese tra 100 e 1000 pixel.
  • Le figure saranno completamente contenute nell'immagine.
  • Le figure avranno una larghezza della linea di 1 pixel.
  • Le immagini non useranno l'antialiasing. Saranno solo nero su bianco.
  • Le figure possono toccare, intersecarsi o trovarsi all'interno di un'altra figura.
  • Le figure che si intersecano avranno un massimo di 4 pixel comuni.
  • Le cerchie avranno un diametro di 20 pixel o più.
  • I lati del rettangolo saranno lunghi 10 o più pixel.
  • Non è possibile utilizzare alcun built-in o librerie che riconoscono le forme o qualsiasi altra funzione che renda banale questa sfida.
  • Restituisce o stampa 2 numeri interi con i conteggi di cerchi e rettangoli.

Esempio 1

Esempio 1

Risposta: 3 4

Esempio 2:

inserisci qui la descrizione dell'immagine

Risposta: 4 13

Questa è una sfida del codice golf, quindi vincerà il programma o la funzione più breve in ogni lingua.


Posso già dirlo, contare il rettangolo riguarderà il conteggio degli angoli, ma i cerchi saranno molto più difficili.
Bálint,

Risposte:


3

PHP - 355 byte

Il conteggio dei byte non include '<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;}

Nei due casi di test, gli URL che ho usato sono http://i.stack.imgur.com/qnIFk.pnge http://i.stack.imgur.com/HV9k3.png.

Conta le linee orizzontali e le divide per due per ottenere il numero di forme. Si basa sull'osservazione che i cerchi hanno segmenti orizzontali più corti e che i rettangoli hanno segmenti orizzontali più lunghi.

Hack ammesso, non è garantito che funzioni per qualsiasi cosa diversa dai casi di test!

Ho provato a ruotare le immagini di ± 45 ° e rilevare le linee orizzontali. Ciò equivarrebbe a controllare le linee diagonali e raccoglierebbe i cerchi meglio, ma non sono riuscito a trovare un algoritmo di interpolazione che abbia lasciato bordi abbastanza puliti su cui lavorare. Ad esempio, potrebbero confondere una linea in due file di pixel e confondere il conteggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.