.


Processamento digital de imagens
Filtragem


Exemplo: Filtro de médias

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:

  1. - definir as dimensões do filtro
  2. - definir os pesos do filtro
  3. - varrer a imagem dentro da área possível e, para cada posição
    1. fazer uma segunda varredura el linhas e colunas, para varrer a vizinhança e calcular o resultado.
  
variar linhas:
    variar ncolunas:
	# calcular filtro...
	s=0
	variar vizinhanca_em linhas:
		variar vizinhanca_em colunas:
			s=s+ pixel*peso
        novo_pixel=s/soma_pesos
  

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?

Filtragem 2D usando OpenCV

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

  1. - IMAGEM: Matriz imagem
  2. - ddepth=-1: a saída tem a mesma profundidade que a entrada
  3. - (usar sempre -1)
  4. - kernel=P : especifica o filtro, uma matriz P de pesos.

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((3,3), np.float32) # cria uma matriz de tamanho 3x3
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". # passa baixas
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)

Função BLUR = embaçar

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.

Gaussian Blur

É 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)

  1. - IMA= Imagem de entrada
  2. - ksize: tamanho da janela do filtro (kernel size, exe (5,5), (7,7) (3,3) )
  3. - sigmaX e sigmaY: valores do desvio padrão que definem o filtro Gaussiano X (horizontal) Y (vertical).
  4. - borderType especifica como serão representadas as bordas (que não são filtradas devido ao tamanho da janela móvel, pois nas bordas a vizinhança não está definida. Pode ser:
    1. - cv.BORDER_CONSTANT : espeficicar um valor digital, ex:255 para branco
    2. - cv.BORDER_REPLICATE : repete o valor do pixel da imagem original
    3. - cv.BORDER_TRANSPARENT
    4. - veja a documentação para mais opções.

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.

ima = cv2.GaussianBlur(I, ksize=(5,5), sigmaX=0, sigmaY=0)
cv2_imshow(ima)

Aplique este filtro a sua imagem.

Mediana

É 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)

  1. - Raio: define a vizinhança do pixel usando um raio em torno do pixel
  2. - sigmaSpace: é o desvio padrão espacial usado no filtro Gaussiano. Pixels mais próximos (em espaço) recebem maior peso.
  3. - sigmaColor: define o desvio padrão em termos de valores digitais. Com isto, pixels com valores digitais mais próximos recebem maior peso e pixels muito diferentes menores pesos

Tarefas

Aplique filtros passa-baixas com diferentes tamanhos da hjanela de pesos e compare o efeito do tamanho da janela no resultado.

  1. Filtro passa-baixas (3x3)
  2. Filtro passa baixas (5x5)
  3. Filtro passa baixas (7x7)

com a função geral filter2D crie janelas móveis e aplique os seguintes filtros 3x3.

    filtro direcional norte
  1. filtro direcional leste
  2. filtro direcional noroeste
  3. filtro passa-altas 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:

  1. - Qual filtro é mais adequado para identificar as fronteiras na imagem?
  2. - Uma série de pontos claros aparecem dentro da imagem aérea de um 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?
  3. - Aplicando o filtro passa altas depois do baixas baixas é obtida a imagem original?
  4. - por quê devemos dividir por 9 os valores da janela do filtropassa-baixas 3x3?