.
Um exemplo clássico de fitro espacial é o cálculo da média 3x3. Este filtro consiste em atribuir ao pixel na imagem de saída a média de uma vizinhança 3x3 em torno do pixel em questão.
Claro que se pode estender o mesmo princípio a vizinhanças maiores, como 5x5, 7x7...
3x3 ou 5x5
O efeito obtido nesta transformação depende dos pesos do filtro.
Para filtrar, então, devemos:
|
Cuidado! Esta operação não pode ser executada nas bordas das imagens, porque faltam vizinhos. A varredura deve começar dentro da imagem e terminar antes da borda. O espaço não filtrado depende do tamanho do filtro. No caso do filtro 3x3, uma borda de 1 pixel é deixada.
Verifique que ocorre nos casos dos filtros 3x3 ou 5x5 nas imagens acima o. Para construir um filtro, devemos definir inicialmente uns parâmetros geométricos.
Qual o tamanho da borda no caso de um filtro t5x5, e um 7x7 e um 11x11?
Para começar o exercício, leia a imagem "dog.jpg" do drive (consulte a aula 3) e transforme esta imagem a imagen cinza (RGB2GRAY).
OpenCV possui soluções prontas para efetuar a filtragem de imagens. Uma opção é usar uma função de convolução 2D genérica, outra é aplicar os filtros previamente definidos. Em cada caso, é necessário conhecer os parâmetros de entrada.
Convolução 2D - filter2D é uma função geral que aceita como entrada uma imagem e a matriz de pesos(kernel) definida pelo usuário
cv2.filter2D(IMAGEM, ddepth=-1, kernel=P)
argumentos
aplique um filtro passa baixas 3x3 com o exemplo abaixo.
Existe uma maneira simples para criar uma matriz de pesos usando as vantagens de Python... a função ones de numpy
np.ones((5,5), np.float32) # cria uma matriz de tamanho 5x5
Com isto, podemos aplicar o filtro à imagem. Certifique-se de trocar o nome da variável da imagem, aqui está como "I".
P = np.ones((3,3), np.float32) # cria uma matriz de tamanho 3x3
P=P/np.sum(P) # é necessário dividir pela soma de todos os pesos
im = cv2.filter2D(I, ddepth=-1,kernel=P)
cv2_imshow(im)
Open CV tem uma função específica para passa-baixas (BLUR). Neste caso devemos especificar apenas a imagem e as dimensões do filtro
cv2.blur(src=image, ksize=(5,5))
a biblioteca se encarrega de construir o filtro no tamanho especificado Aplique este filtro à imagem.
É um filtro passa-baixas Gaussiano usando. Neste caso, a definição dos pesos depende do valor do desvio padrão, de pode ser especificado, mas também pode ser usado um valor “default".
GaussianBlur(IMA, ksize, sigmaX, sigmaY)
Escolhendo sigmaX=0, usa-se o valor default do desvio padrão, calculado em função do tamanho da janela. Mas também é permitido explicitar valores (positivos) de sigma.
cv2_imshow(ima)
Aplique este filtro a sua imagem.
É um filtro passa baixas, mas não é linear. Neste caso, apenas o tamanho da vizinhança deve ser especificado.
medianBlur(src, ksize)
bilateralFilter
É basicamente um filtro Gaussiano, que varia seus pesos em função do contraste local. Com isto, ele se adapta a cada região, suavizando com maior ou menor intensidade a região com a finalidade de preservar as bordas e detalhes que são fortemente afetados pelo filtro Gaussiano.
bilateralFilter(src, raio, sigmaColor, sigmaSpace)
Aplique filtros passa-baixas com diferentes tamanhos da hjanela de pesos e compare o efeito do tamanho da janela no resultado.
com a função geral filter2D crie janelas móveis e aplique os seguintes filtros 3x3.
Filtre uma imagem usando um filtro passa-baixas e calcule a diferença entre o a imagem original e a imagem filtrada. Visualize esta diferença como uma imagem na tela do computador.
O efeito de cada filtro depende dos pesos atribuídos à posições da janela móvel. Com base na análise dos resultados acima, responda: