Operadores de Vizinhança

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:

  1. Supor que as imagens são infinitas e fora da imagem todos os pixels são zerados.
  2. Supor que a imagem se repete nos ladrilhos de uma parede infinita.

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.

Translação periódica

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.