Exercício, construir um filtro
Para filtrar, então, devemos varrer a imagem dentro da área possível e, para cada posição, fazer uma segunda varredura el milhas e colunas, da vizinhança.
variar linhas:
variar ncolunas:
# calcular filtro...
s=0
variar vizinhanca_em linhas
variar vizinhanca_em colunas
s=s+ pixel*peso
|
Para construir um filtro, devemos definir inicialmente uns parâmetros geométricos.
- Tamanho do filtro = dim (dim=3,5,7,..?) deve ser ímpar e definido pelo usuário
- o número de Vizinhos antes e depois do pixel central: lado=(dim-1)/2
Cuidado!A varredura não pode ser feita para o primeiro pixel, devemos começar no elemento (lado)
e não podemos terminar na ultima linha (n) mas devemos terminar em (n-lado )
Verifique nas imagens abaixo o que ocorre nos casos dos filtros 3x3 ou 5x5.
3x3 ou 5x5
Na primeira parte vamos ler a imagem e calcular estas e outras dimensões.
dim=5 # dimensao do filtro exe 3x3 dim=3, 5x5 dim=5...
lado=(dim-1)/2 # numero de vizinhos antes ou depois do central
lado=np.uint8(lado)
|
Também vamos dar a opção de construir filtros 3x3m 5x5, etc, passa altas ou passa baixas, usando duas funções.
depois lemos a imagem e criamos uma imagem vazia para armazenar a saída. ~unca use a imagem original.
#_______________ escolha o filtro aqui
f=low_pass(dim) # escolhe passa baixas (3x3)
# f=high_pass(dim)
print('dim=',dim, 'vizinho=',lado)
print('F=',f)
# ler imagem de entrada e recuperar dimensoes
X1= plt.imread('vw.tif')
nl,nc = X1.shape
X=np.array(X1, dtype=float) #transforma em float para facilitar multiplicacoes
Y=np.zeros((nl,nc),dtype = float) # replica imagem para gerar uma saida
Y=np.uint8(Y) # em uint 8 para armazenar em byte
|
Agora desenvolvemos o filtro...
for L in range(lado,nl-lado): # varrer em linhas, para vizinhos+central
for C in range (lado, nc-lado): # varrer em colunas
s=0. # zerar soma para convolucao
for i in range(dim): # varrer filtro em linhas e colunas
for j in range(dim):
# determina o pixel na imagem
p=(L-lado)+i
q=(C-lado)+j
s=s+X[p,q]*f[i,j] #pixel*peso
if s>255: #truncar se ficar fora da faixa
s=255
if s<0:
s=0
v=np.uint8( np.round( s ) ) # muda a uint8
Y[L,C]=v # salva na posicao do central
plt.imsave('saida.png',Y,cmap='gray')
|
Vale a pena lembrar que a posição do pxielcentral não pode ser definida nas bordas da imagem, pois não não é possível ler sua vizinhança.
Bem, agora, com isso em mente, escreva um filtro passa baixas (3x3) e aplique à imagem
da kombi,
salve o resultado no disco rígido e compare as duas imagens.
repita o exercício com um filtro passa baixas 5x5. Compare os resultados.Qual deles tem maior efeito?
Escreva o filtro passa altas 3x3. aplique o filtro e analise o resultado. Qual é o efeito?
você seria capaz de escrever um filtro:
- FIltro passa-baixas (3x3)
- Filtro passa baixas (5x5)
- Filtro passa baixas (7x7)
- Filtro passa baixas (3x3) ponderado
- Filtro passa altas
- filtro direcional norte
- filtro direcional leste
- filtro direcional noroeste
- outros filtros direcionais
então vamos ver!
Filtro passa baixas (3x3) ponderado
O efeito de cada filtro depende dos pesos atribuídos à
posições da janela móvel. Com base na análise
dos resultados acima:
- Qual filtro é mais adequado para identificar as fronteiras
na imagem?
- Uma série de pontos claros aparecem dentro do lago. Estes
valores são ruído e devem ser eliminados. Qual filtro
serve para ocultar remover ruídos na imagem? O ruído
é totalmente eliminado?
- Aplicando o filtro passa altas depois do baixas baixas é
obtida a imagem original?
- O que ocorre com a imagem filtrada usando o passa altas (3x3) quando
em lugar de 9 no pixel central é utilizado o valor 8? Que efeito
causa na imagem?
- Deseja-se delimitar as linhas do estacionamento na parte inferior
esquerda da imagem. Qual(quais) filtro(s) devem ser usados?
- Deseja-se digitalizar as bordas das construções no
centro da imagem. É possível facilitar a definição
das fronteiras usando algum filtro? qual?