.


Processamento digital de imagens
Filtros


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.

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:

então vamos ver!

Filtro passa baixas (3x3) ponderado
1 2 1
2 4 2
1 2 1

O efeito de cada filtro depende dos pesos atribuídos à posições da janela móvel. Com base na análise dos resultados acima: