Nesta semana iremos exercitar operações de vizinhança, tais como média ponderada móvel (convolução) e Padrão Local Binário que constrói um padrão baseado na vizinhança-8 de cada pixel.
Em linguagens de programação estilo C, estes algoritmos de vizinhança são usualmente programados na forma de varredura da janela em toda a imagem. Este estilo de programação não é apropriado para o Numpy. Felizmente, na grande maioria dos casos, é possível trocar o processo de varredura da janela na imagem por um processo de translações da imagem guiadas pelos elementos da janela. Já sabemos que é possível implementar a translação utilizando-se do recurso de fatiamento do NumPy, como vimos na seção "Translação" em:
Uma decisão inerente aos operadores de vizinhança é sobre o que fazer com os pixels que estão nas primeiras e últimas linhas e colunas, pois a vizinhança destes pixels extrapola a região da imagem. Existem inúmeras soluções que tratam disto. As duas mais comuns são:
O primeiro caso será tratado quando formos discutir a convolução linear. O segundo caso implementaremos aqui; sua importância deve-se à teoria de processamento de sinais digitais, em particular à Transformada Discreta de Fourier (que não será assunto de nossas atividades). É importante mencionar que, neste caso, as imagens são modeladas como periódicas e as translações associadas também são todas periódicas.
O objetivo da primeira atividade da semana é fazer uma função que implementa a translação periódica.
Existem três versões básicas em que podemos implementar a translação periódica:
Veja no breve tutorial em
a primeira forma de se implementar a translação. Neste tutorial a translação periódica é implementada replicando-se a imagem 4 vezes e extraindo uma janela do mesmo tamanho da imagem original porém transladada.
A segunda forma está feita pela função
da toolbox ia898. Nesta função
o algoritmo utilizado usa indexação por arrays, como feito no exercício da
semana passada com o
A operação que permite a periodicidade no cálculo dos índices é o "módulo", implementado pelo operador "%" do NumPy.
Existe uma terceira forma de implementar que é fatiar a imagem em 4 sub-regiões retangulares e reposicioná-las para gerar a imagem periodicamente transladada. É possível que esta última opção seja a mais eficiente de todas, pois somente utiliza fatiamento.
A próxima atividade consiste na implementação da translação periódica. Procure fazer 3 versões, conforme a orientação acima.
Um dos cuidados nas implementações é observar que os parâmetros da translação podem ser negativos ou ainda bem maiores que a largura ou altura da imagem.