Wie viele Formen hat dieses Bild?

10

Kinder sind sehr gut darin, Objekte zu klassifizieren und zu zählen. Computer scheinen mehr Probleme zu haben. Dies ist eine vereinfachte Version dieses Problems. Können Sie ein kleines Programm schreiben, das Objekte in einem Bild klassifizieren und zählen kann?

Das Problem: Wenn ein Bild einen oder mehrere Kreise und Rechtecke enthält, geben Sie 2 Ganzzahlen mit der Anzahl der Kreise und der Anzahl der Rechtecke zurück.

Regeln

  • Das Eingabebild besteht aus schwarzen Figuren auf weißem Hintergrund in einem beliebigen Bitmap-Format.
  • Die Bildbreite und -höhe liegt zwischen 100 und 1000 Pixel.
  • Die Figuren sind vollständig im Bild enthalten.
  • Figuren haben eine Linienbreite von 1 Pixel.
  • Bilder verwenden kein Anti-Aliasing. Sie werden nur schwarz auf weiß sein.
  • Figuren können sich berühren, schneiden oder sich in einer anderen Figur befinden.
  • Sich überschneidende Figuren haben maximal 4 gemeinsame Pixel.
  • Kreise haben einen Durchmesser von 20 Pixel oder mehr.
  • Rechteckige Seiten sind 10 oder mehr Pixel lang.
  • Sie dürfen keine integrierten Funktionen oder Bibliotheken verwenden, die Formen erkennen, oder andere Funktionen, die diese Herausforderung trivial machen.
  • Geben Sie 2 Ganzzahlen mit der Anzahl der Kreise und Rechtecke zurück oder drucken Sie sie aus.

Beispiel 1

Beispiel 1

Antwort: 3 4

Beispiel 2:

Geben Sie hier die Bildbeschreibung ein

Antwort: 4 13

Dies ist eine Code-Golf-Herausforderung, sodass das kürzeste Programm oder die kürzeste Funktion in jeder Sprache gewinnt.

Logikritter
quelle
Ich kann bereits sagen, dass es beim Zählen des Rechtecks ​​um das Zählen von Ecken geht. Kreise werden jedoch viel schwieriger.
Bálint

Antworten:

3

PHP - 355 Bytes

Die Byteanzahl enthält nicht '<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;}

In den beiden Testfällen sind die von mir verwendeten URLs http://i.stack.imgur.com/qnIFk.pngund http://i.stack.imgur.com/HV9k3.png.

Zählt horizontale Linien und teilt durch zwei, um die Anzahl der Formen zu erhalten. Verlässt sich auf die Beobachtung, dass Kreise kürzere horizontale Segmente und Rechtecke längere horizontale Segmente haben.

Zugelassener Hack, der garantiert nur für die Testfälle funktioniert!

Ich habe versucht, die Bilder um ± 45 ° zu drehen und horizontale Linien zu erkennen. Dies wäre gleichbedeutend mit der Überprüfung auf diagonale Linien und würde die Kreise besser erfassen, aber ich konnte keinen Interpolationsalgorithmus finden, der genügend Kanten sauber ließ, um damit zu arbeiten. Zum Beispiel könnten sie eine Zeile in zwei Pixelreihen verwischen und die Anzahl durcheinander bringen.


quelle