Сколько фигур на этой картине?


10

Дети очень хорошо умеют классифицировать предметы и считать их. Компьютеры, кажется, имеют больше проблем. Это упрощенная версия этой проблемы. Можете ли вы написать небольшую программу, которая может классифицировать и считать объекты на изображении?

Проблема: Для изображения, содержащего один или несколько кругов и прямоугольников, вернуть 2 целых числа с количеством кругов и количеством прямоугольников.

правила

  • Входное изображение будет черными фигурами на белом фоне в любом выбранном вами растровом формате.
  • Ширина и высота изображения будут между 100 и 1000 пикселей.
  • Рисунки будут полностью содержаться в изображении.
  • Цифры будут иметь ширину линии 1 пиксель.
  • Изображения не будут использовать сглаживание. Они будут только черным по белому.
  • Фигуры могут касаться, пересекаться или находиться внутри другой фигуры.
  • Пересекающиеся фигуры будут иметь максимум 4 общих пикселя.
  • Круги будут иметь диаметр 20 или более пикселей.
  • Стороны прямоугольника будут иметь длину 10 или более пикселей.
  • Вы не можете использовать любые встроенные модули или библиотеки, которые распознают фигуры, или любые другие функции, которые делают эту задачу тривиальной.
  • Вернуть или вывести 2 целых числа с количеством кружков и прямоугольников.

Пример 1

Пример 1

Ответ: 3 4

Пример 2:

введите описание изображения здесь

Ответ: 4 13

Это сложная задача для гольфа, поэтому победит самая короткая программа или функция на каждом языке.


Я уже могу сказать, что подсчет прямоугольника будет означать подсчет углов. Однако, круги будут намного сложнее.
Балтин

Ответы:


3

PHP - 355 байт

Количество байтов не включает '<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;}

В двух тестовых случаях я использовал URL http://i.stack.imgur.com/qnIFk.pngи http://i.stack.imgur.com/HV9k3.png.

Считает горизонтальные линии и делит на два, чтобы получить количество фигур. Полагается на наблюдение, что у кругов есть более короткие горизонтальные сегменты, и у прямоугольников есть более длинные горизонтальные сегменты.

Допускается взлом, не гарантируется работа для чего-либо, кроме тестовых случаев!

Я попытался повернуть изображения на ± 45 ° и определить горизонтальные линии. Это было бы эквивалентно проверке диагональных линий и лучше подбирало круги, но я не смог найти алгоритм интерполяции, который оставил бы достаточно чистые края для работы. Например, они могут испачкать строку в два ряда пикселей и испортить счет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.