Quantas formas existem nesta imagem?


10

As crianças são muito boas em classificar objetos e contá-los. Os computadores parecem ter mais problemas. Esta é uma versão simplificada deste problema. Você pode escrever um pequeno programa que possa classificar e contar objetos em uma imagem?

O problema: dada uma imagem contendo um ou mais círculos e retângulos, retorne 2 números inteiros com a contagem de círculos e a contagem de retângulos.

Regras

  • A imagem de entrada será em preto sobre fundo branco, em qualquer formato de bitmap que você escolher.
  • A largura e a altura da imagem estarão entre 100 e 1000 pixels.
  • As figuras estarão totalmente contidas na imagem.
  • Os números terão uma largura de linha de 1 pixel.
  • As imagens não usarão anti-aliasing. Eles serão pretos apenas no branco.
  • As figuras podem tocar, se cruzar ou estar dentro de outra figura.
  • As figuras que se cruzam terão no máximo 4 pixels comuns.
  • Os círculos terão um diâmetro de 20 pixels ou mais.
  • Os lados do retângulo terão 10 ou mais pixels de comprimento.
  • Você não pode usar nenhum built-in ou bibliotecas que reconheçam formas ou qualquer outra função que torne esse desafio trivial.
  • Retorne ou imprima 2 números inteiros com as contagens de círculos e retângulos.

Exemplo 1

Exemplo 1

Resposta: 3 4

Exemplo 2:

insira a descrição da imagem aqui

Resposta: 4 13

Este é um desafio de código de golfe, portanto o programa ou função mais curto em cada idioma vencerá.


Eu já posso dizer, contar o retângulo será sobre contar cantos. Porém, os círculos serão muito mais difíceis.
Bálint

Respostas:


3

PHP - 355 bytes

A contagem de bytes não inclui '<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;}

Nos dois casos de teste, os URLs que usei são http://i.stack.imgur.com/qnIFk.pnge http://i.stack.imgur.com/HV9k3.png.

Conta as linhas horizontais e divide por dois para obter o número de formas. Baseia-se na observação de que os círculos têm segmentos horizontais mais curtos e os retângulos têm segmentos horizontais mais longos.

Hack admitido, não garantido que funcione para outra coisa senão os casos de teste!

Tentei girar as imagens em ± 45 ° e detectar linhas horizontais. Isso seria equivalente à verificação de linhas diagonais e melhoraria os círculos, mas não consegui encontrar um algoritmo de interpolação que deixasse as bordas limpas o suficiente para trabalhar. Por exemplo, eles podem borrar uma linha em duas linhas de pixels e atrapalhar a contagem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.