Não é fácil projetar um conjunto de testes para garantir que o seu programa esteja correta. No caso em que o resultado é Falso, i.e., não simétrico, basta um pixel não ser simétrico para o resultado ser Falso. Com isso, o conjunto de teste com uma imagem enorme com muitos pixels não simétricos não é bom teste. Por exemplo, neste caso, faltou um teste onde tudo seja simétrico, com exceção da origem (F[0,0]).
Solução apresentada pelo Marcelo, onde é comparado com a imagem refletida com translação periódica de 1 deslocamento é bem conceitual. A solução do Deângelo parece ser a mais rápida: não foi feita nenhuma cópia e comparou apenas com metade dos pixels.
Existe ainda pequeno problema a ser encontrado na questão de utilizar apenas metade dos pixels para serem comparados.
A redução da imagem deve ser feita com uma filtragem inicial de período de corte 2.r onde r é o fator de redução da imagem. A seguir, é feita a reamostragem (decimação).
Para se fazer a redução no domínio da frequência, bastaria recortar o espectro da imagem original e fazer a transforma inversa de Fourier.
In [1]:
import numpy as np
import sys,os
import matplotlib.image as mpimg
ia898path = os.path.abspath('../../')
if ia898path not in sys.path:
sys.path.append(ia898path)
import ia898.src as ia
In [ ]:
def imresize(f, size):
'''
Resize an image
Parameters
----------
f: input image
size: integer, float or tuple
- integer: percentage of current size
- float: fraction of current size
- tuple: new dimensions
Returns
-------
output image resized
'''
return f
pconv para executar no domínio da frequência, caso o número de
elementos não zeros da menor imagem, é maior que um certo valor, digamos 15.
Nome da função: pconvfft
In [ ]:
def pconvfft(f,h):
'''
Periodical convolution.
This is an efficient implementation of the periodical convolution.
This implementation should be comutative, i.e., pconvfft(f,h)==pconvfft(h,f).
This implementation should be fast. If the number of pixels used in the
convolution is larger than 15, it uses the convolution theorem to implement
the convolution.
Parameters:
-----------
f: input image (can be complex, up to 2 dimensions)
h: input kernel (can be complex, up to 2 dimensions)
Outputs:
image of the result of periodical convolution
'''
return f
In [ ]:
/home/lotufo/ia898/dev/wavelets.ipynb