.
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:
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.
programe um filtro de Roberts e um filtro de Sobel. São filtros não lineares.