O objetivo deste desafio é determinar o ângulo de uma linha em uma imagem.
Regras sobre a imagem:
- O fundo da imagem ficará branco (
#FFFFFF
) - O traço da linha será preto (
#000000
) - A linha NÃO será anti-alias
- A imagem terá 100x100 pixels
- A linha começará no centro da imagem
- A linha começará a apontar para baixo (6 horas)
- A linha terá 50 pixels de comprimento
- O ângulo da linha será medido indo no sentido anti-horário a partir da posição inicial
- O codec de imagem será
.jpg
ou.png
O formato de entrada será um nome de arquivo transmitido pela linha de comando arg, entrada de script ou função arg. O formato de saída é simples - basta gerar o número de graus (por exemplo 90
).
As respostas podem ser de ± 1 grau da medida declarada. Aqui estão alguns exemplos de imagens:
Uma imagem de referência a 45 graus com fundo cinza
0 graus
45 graus
50 graus
130 graus
230 graus
324 graus
Aqui está o código usado para criar as imagens (isso é codificado com Processing ):
int deg = 45;
int centX = width/2, centY = height/2;
background(255);
noSmooth();
line(centX,
centY,
centX + sin(radians(deg))*50,
centY + cos(radians(deg))*50);
saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'
code-golf
image-processing
J Atkin
fonte
fonte
Respostas:
Pitão -
2826 bytesUsa o mesmo tipo de estratégia de força bruta que a resposta js.
Recebe a entrada como nome do arquivo de stdin.
fonte
JavaScript (ES6), 225
227244bytesVamos fazer a bola rolar:
Basta passar o URL da imagem para a função:
Alertas graus dentro do intervalo ± 1. Passou em todos os casos de teste.
Ungolfed
Editar% s
fonte
s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
file://
. Você precisa definir acrossOrigin
propriedade Além disso, não funcionará se o carregamento da imagem demorar 0,00001 segundos a mais do que a criação da tela. Além disso, você não precisaf=
cortar 2 bytes. Mas é realmente uma boa solução !!! Meu voto positivo por isso.onload
parte porque fui prejudicado em outro desafio por causa disso. Então eu pensei que não há problema em assumir que ele carrega rápido o suficiente. Em relação à função anônima, não sei como contá-la. Se eu cortof=
e quero invocá-lo, tenho que envolvê-lo()
como(s=>{})('arg');
. Posso ignorar isso na contagem de bytes?Matlab,
118104 bytesGero uma matriz do mesmo tamanho da imagem com números complexos (0 no centro) e retiro dessa matriz os valores que estão na linha. O argumento da média desses é exibido.
Obrigado a @ThomasKwa por sugerir uma melhoria na precisão que também resultou em um código mais curto !!!
fonte
Matlab,
8677 bytesAqui está outra maneira de usar o Matlab:
Isso lê o arquivo (roubado do flawr ) e localiza os índices dos pixels pretos. Em seguida, elabora o vetor que aponta do centro da imagem para cada pixel preto e usa
atan2d
para encontrar o ângulo, arredondando para obter ângulos inteiros e fazendomod(...,360)
para obter resultados no intervalo certo. Para obter o ângulo correto (há um pouco de erro nos pixels próximos ao centro), use o ângulo calculado com mais frequência.Obrigado a slvrbld pela
im2bw
sugestão!fonte
Labview, 10098 bytes
Vamos colocar outro código do labview por aí.
Como não existe uma maneira oficial de contar bytes no labview, uso o tamanho do arquivo quando salvo. Contando alternativamente todos os fios e funcionando como 1 e o caso como 2, ele chegaria a 71.
Carregue a imagem, achatar para 1D, digitalize 0s de ambos os lados e pegue o primeiro, volte ao ponto e use a geometria para obter o ângulo.
fonte
,
casas decimais.