Sua tarefa é escrever um programa que obtenha uma imagem de entrada e execute-a através da detecção de borda para se tornar uma imagem de saída.
A detecção de borda funciona da seguinte maneira (se não estiver claro, consulte detecção de borda sobel ):
- O valor de um pixel é o brilho total de um pixel; portanto, se estiver em cores, primeiro será necessário convertê-lo em escala de cinza (para manter as coisas simples e com capacidade para jogar golfe, você pode usar o valor médio de R, G e B)
- As fórmulas para G x e G y para o pixel p (i, j) são:
- G x = -1 * p (i-1, j-1) - 2 * p (i-1, j) - 1 * p (i-1, j + 1) + 1 * p (i + 1, j -1) + 2 * p (i + 1, j) + 1 * p (i + 1, j + 1)
- G y = -1 * p (i-1, j-1) - 2 * p (i, j-1) - 1 * p (i + 1, j-1) + 1 * p (i-1, j 1) + 2 * p (i, j + 1) + 1 * p (i + 1, j + 1)
- O valor para o tamanho da aresta nesse pixel é então: √ (G x 2 + G y 2 )
A imagem de saída é para cada pixel o tamanho da borda √ (G x 2 + G y 2 ) como escala de cinza.
Bônus:
- Execute um desfoque gaussiano para suavizar a imagem antes que a detecção de borda apareça, para omitir qualquer borda menor. Isso dá um bônus de -30% no resultado final.
- Considere o ângulo da aresta. Você fornece alguma cor ao pixel de saída, obtendo o mesmo valor em escala de cinza e adicionando cores a uma roda de cores usando o ângulo obtido da fórmula arctan (G y / G x ). Isso dá outro bônus de -30% no resultado final.
Regras:
- Você pode omitir o valor dos pixels da borda e configurá-los para preto ou usar 0 para qualquer pixel fora da imagem.
- Sua imagem de saída deve estar em um formato de imagem que possa ser aberto na maioria dos computadores.
- A saída deve ser gravada no disco ou canalizável para um arquivo.
- A entrada é fornecida como um argumento da linha de comando, na forma de um caminho relativo para a imagem ou canalizada a partir da linha de comando.
- Este é o código golf, pelo que o código mais curto em bytes vence!
Respostas:
J,
166 164 161 154 150 150 143143 bytes.Não jogou golfe demais; Eu quase derrubei minha implementação mais longa (veja abaixo), então provavelmente há muito espaço para melhorias. Usa biblioteca BMP. Salva o resultado no arquivo
o
. Eu manusei pixels de borda usando apenas células 3x3 completas, para que a imagem final tenha largura e altura menores em 2 pixels.Uso:
Expandido:
Entrada e saída de amostra:
fonte
;._3
operador de subarray. Notei que você definiu um verbop
com classificação 2 para operar nos subarrays depois de criá-los. Você poderia operar em cada sub-matriz quando cortar. Minha tentativa de implementá-lo com base no seu trabalho é256#.3#"0<.255<.3 3((|:S)&*+&.*:&(+/)&,S&*);._3%&3(3#256)+/@#:
. Isso deve reduzir para 126 bytes no total.'o'writebmp~256#.3#"0<.255<.3 3(*+&.*:&(+/)&,(*|:))&((-,.0,.])1 2 1);._3%&3(3#256)+/@#:readbmp]stdin''
assumindo que apenas o nome do arquivo é inserido no stdin. Você pode fazer isso usandoecho -n
para que uma nova linha extra não seja incluída no stdin. No meu computador, o script sai automaticamente ao usar uma entrada canalizada em um script, o que significa que não preciso incluirexit''
e salvar 6 bytes extras, mas não tenho certeza se isso é verdade para todos.Python, 161 * 0,7 = 112,7 bytes
Com o bônus Gaussian Blur.
Como você não proibiu explicitamente os métodos internos, aqui está o OpenCV:
Sem bônus, 136 bytes
fonte
MATLAB, 212 * 0,4 = 84,8 bytes
Usando a caixa de ferramentas de filtro e o espaço de cores HSV
ou não destruído
fonte
Love2D Lua, 466 bytes
Recebe a entrada da linha de comando e gera um arquivo chamado "o" na pasta de dados do aplicativo Love2D. O Love2D não permitirá que você salve arquivos em qualquer outro lugar.
Assim como o golfe que eu conseguia, provavelmente poderia ser ainda mais.
Explicado
Teste
E...
Embora na verdade não melhore minha pontuação (piora de fato), aqui está a versão com a roda de cores implementada.
900 - 270 = 630 bytes
fonte