Imagens sintéticas são bastante utilizadas nos testes de algoritmos e na geração de padrões de imagens.
Iremos aprender a gerar os valores dos pixels de uma imagem a partir de uma equação matemática
de forma muito eficiente, sem a necessidade de se usar explicitamente a varredura dos
pixels através do comando for
.
A forma preferencial de criação de imagens sintéticas, quando sua equação é fornecida, é
através do uso das funções que geram uma matriz de coordenadas. As duas funções que
iremos utilizar neste curso são indices
e meshgrid
.
Estude o tutorial em:
Ele é fundamental para entender os exemplos a seguir.
In [7]:
import numpy as np
import sys,os
ia898path = os.path.abspath('/etc/jupyterhub/ia898_1s2017/')
if ia898path not in sys.path:
sys.path.append(ia898path)
import ia898.src as ia
A função "sela" bidimensional é uma função dada pelo produto de suas coordenadas r
e c
.
Observe que, implementando desta forma, é possível fazer com que o código Python/NumPy fique
muito próximo à equação matemática, colocada a seguir.
Vamos gerar uma função sela, onde os valores para as linhas serão valores inteiros entre -75 e 75 e os valores para as colunas, inteiros no intervalo [-100,100]:
$$ f(r,c) = r \ c $$$$ \text{para} \ r \in [-75,75] $$$$ c \in [-100,100]$$No exemplo a seguir é utilizado a função arange
para gerar os vetores de coordenadas. Para melhorar
a visualização foi utilizada a função ia636:iaisolines iaisolines
que permite visualizar os
pixels de mesmo valores (isolinhas) da imagem gerada com uma cor destacada.
In [10]:
r,c = np.meshgrid(np.arange(-75,75), np.arange(-100,100), indexing='ij')
f = r * c
fn = ia.normalize(f)
ia.adshow(fn, 'Ponto de sela')
#ia.adshow(ia.iaisolines(fn,9), 'Ponto de sela com isolinhas')
Implemente alguma das seguintes funções da toolbox ia636:MainPage
que também foram feitas desta forma:
In [11]:
r,c = np.indices( (100,100))
# implemente aqui a equação da sua função bidimensional
#ia.adshow(F)
Uma sugestão de exercício avançado opcional é gerar a função de Gabor, muito utilizada em filtro direcionais. A equação da função de Gabor pode ser vista em Gabor filter. Implemente a função real.
indices
. Uma função também escrita com índices matriciais, porém muito mais complexa de entender é a ia636:iagaussian
. Veja
que o código é extremamente curto, porém bastante complexo e ela ainda funciona para qualquer dimensão, desde 1-D, 2-D,
3-D, isto é, n-D. Para quem estiver interessado em entender como ela funciona, existe uma demonstração que procura
explicar seu funcionamento em