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!