.


Processamento digital de imagens
Filtros


Exercício, Chamar uma função de filtro

Agora vamos desenvolver uma versão um pouco melhorada e genérica do programa de filtragem. Nosso programa terá:

A estrutura do programa será a seguinte:

  1. Importar funções, acesso a drive, etc... como em todos os outros exemplos.
  2. Declarar funções de filtros diferentes
  3. Ler imagem, selecionar o filtro e aplicar
  4. opcional: salvar resultado
 import numpy as np
import matplotlib.pylab as plt
from google.colab.patches import cv2_imshow # para mostrar a imagem
from skimage import io

# para salvar no drive
from google.colab import drive
drive.mount('/content/gdrive')
   

Agora podemos criar duas funções com filtros passa-baixas(tamanho_da_janela) e Passa_altas(Tamanho_da_Janela). A função criará o filtro segundo a dimensão especificada.

	  
## ################  PESOS passa baixas # #################
def low_pass(dim):
    f= np.zeros((dim,dim),dtype = float)  # matriz vazia	
    f=f+1          # cria matriz com tudo igual a 1, zeros+1=1	
    f=f/(dim*dim ) #  dividir para calcular a media	
    return(f)

## ################  HIGH_pass  ############################
def high_pass(dim):
    f= np.zeros((dim,dim),dtype = float)  # matriz vazia	
    f=f-1          # cria matriz com tudo igual a -1, zeros-1=-1	
    lado= (dim-1)/2      # coordenada do central no filtro	
    lado=np.uint8(lado)
    f[lado,lado]=dim*dim   # e muda o central para positivo dim*dim	
    return(f)	
	  

O módulo principal abre a imagem, seleciona o filtro e define o tamanho da janela.

	  
  ################# cria janela de filtro tamanho DIM  ################ 	
dim=3               # 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)	

 # escolha o filtro aqui 	
# f=low_pass(dim)
f=high_pass(dim)

print('dim=',dim, 'vizinho=',lado)
print('F=',f)

 ###ler imagem de entrada e recuperar dimensoes  ######################## 	
url="https://docs.ufpr.br/~centeno/m_pdi/exepy/004/capi01.jpg"
I = io.imread(url)
nl,nc= I.shape
#cv2_imshow(I)
plt.imshow(I, cmap=plt.get_cmap('gray'),vmin=0,vmax=255)
X=np.array(I, 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	
	  

Aplicamos. FILTRAGEM propriamente dita

	
for L in range(lado+1,nl-lado-1):           # varrer em linhas 	
    for C in range (lado+1, nc-lado-1):     # varrer em colunas	
        s=0.                             # zerar soma para convolucao	
        #print(L,C)
        for i in range(dim):       # varrer vizinhanca em torno de pixel	
            for j in range(dim):   # em linhas (i) e colunas colunas (j)	
                p=(L-lado)+i-1     # determina o elemento do filtro a ser usado	
                q=(C-lado)+j-1
                #print(i,j,p,q, '--',  f[i,j],'...', X[p,q])
                s=s+X[p,q]*f[i,j]       #pixel*peso	
         # para evitar   valores muito grandes ou negativos	
        if s>255:
            s=255
        if s<0:
            s=0
        v=np.uint8( np.round( s ) )    # arredonda e muda a uint8	
        Y[L,C]=v                       # salva na posicao do central	

cv2_imshow(Y)

io.imsave('/content/gdrive/My Drive/filtrada.tif', Y)
	

Agora, pode ver os resultados em seu drive. se quiser mudar o nome das saidas, fique a vontade.

Desafio

programe um filtro de Roberts e um filtro de Sobel. São filtros não lineares.

VOLTAR