FEN- 06723 – Processamento Digital de Imagens
Projeto 2 – Utilização de máscaras laplacianas
Marcelo Musci
Mestrado Geomática/UERJ-2004
Abstract
The Laplacian is also called as second difference function, and, like the first derivative the second
derivative can be calculated in both the x and y directions and also with respect to x and y together. It
identifies areas where the gradient (first derivative) is constant, for the second derivative is zero when the
gradient is constant.
Images are not continuous functions. They are defined at discrete points in space, and these points are
usually taken to be the centers of the pixels. It is therefore not possible to calculate first and second
derivatives using the methods of calculus. Instead, the derivatives are estimated by differences between
the values of adjacent pixels in the x and y directions, though diagonal or corner differences are also used.
The Laplacian is a 2-D isotropic measure of the 2nd spatial derivative of an image. The Laplacian of an
image highlights regions of rapid intensity change and is therefore often used for edge detection. The
operator normally takes a single graylevel image as input and produces another graylevel image as output.
For instance the Laplacian operator is also a type of high-pass filter.
This project intend to show an application of the Laplacian operator, using matlab functions, in a image,
and discuss the effect of it.
Introdução
O Laplaciano L(x,y) de uma imagem com valores de intensidade de pixels I(x,y) é dado por:
Que pode ser calculado usando um filtro de convolução.
Chama-se de convolução o processo de calcular a intensidade de um determinado pixel em função da
intensidade de seus vizinhos. O cálculo é baseado em ponderação, isto é, utilizam-se pesos diferentes para
pixeis vizinhos diferentes. A matriz de pesos é chamada de kernel da convolução. Para obter o novo valor
do pixel, multiplica-se o kernel pelo valor da imagem original em torno do pixel, elemento a elemento, e
soma-se o produto, obtendo-se o valor do pixel na nova imagem.
Desde que a imagem de entrada é representada como um conjunto de pixels, temos que encontrar um
kernel de convolução que pode aproximar a segunda derivada na definição do Laplaciano. Alguns
exemplos de kernels podem ser vistos na figura 1.
Figura 1 - Três tipos de kernel utilizados em aproximações do filtro Laplaciano.
Nota: o Laplaciano usando pico negativo no centro da matriz é o tipo mais comum; no entanto é
igualmente válido usar o oposto em termos de sinais, ou seja, o centro da matriz positivo e as bordas
negativas.
Usando um desses kernels, o Laplaciano pode ser calculado usando um método de convolução.
A aplicação do operador Laplaciano pode ser usada também como um detector de passagem pelo zero
(“zero crossing detector”), ou seja, pontos na imagem aonde o Laplaciano muda de sinal, sendo a
ocorrência desses pontos justamente nas “bordas” da imagem (pontos aonde a intensidade da imagem
muda rapidamente), embora isso possa ocorrer também em pontos que não são considerados “bordas”.
Por isso o detector de passagem pelo zero (usando o operador Laplaciano) é um tipo de detector de borda,
embora não seja específico para esse fim.
Uma vez que a imagem tenha sido filtrada utilizando-se o operador Laplaciano, a detecção da passagem
pelo zero pode ser feita de inúmeras formas.
A mais simples é utilizar o limiar de mudança entre os pixels da imagem resultante (após a passagem pelo
filtro) como sendo zero, isso produzirá uma imagem binária (se for utilizado um operador morfológico)
aonde os limites entre o primeiro plano e o fundo da imagem representam os locais de passagem pelo
zero.
Outra forma de visualização precisa considerar o fato de que a imagem resultante da passagem pelo
operador Laplaciano, possui valores negativos. Para propósitos de visualização em escala de cinza, a
imagem deve ser re-escalada com a utilização de um “offset” que corresponderá ao nível zero da imagem,
esse valor é de 128. Se o propósito geral for somente a visualização dos locais na imagem da passagem
pelo zero, esse procedimento não é importante.
Implementação
A operação com o operador Laplaciano, pode ser feita com o uso dos comandos ‘filter2’ ou ‘conv2’ do
matlab, que são duas funções para uso em imagens digitais.
O modelo básico de implementação do Laplaciano envolve a multiplicação dos valores dos pixels em
uma janela ou matriz dada. A matriz deve ser quadrada e seu tamanho precisa ser ímpar (3x3, 9x9 etc).
Geralmente, se o numero de pixels na matriz é k, então o peso do pixel central é dado por (k - 1)
enquanto todos os outros pixels possuem pesos de -1, sendo a soma total de todos os pixels iguais a 0
(zero). O filtro assim definido, passa-alta, permite passar uma ampla série de faixas de freqüências
conforme a matriz do filtro definida - maior tamanho, maior a banda passante. Embora precauções devem
ser tomadas pelo uso de matrizes muito largas, pois podem causar problemas nas bordas da imagem
resultante.
Resultados
A aplicação dos filtros Laplacianos na imagem original, figura 2, levou a diversos resultados, figuras 3 a
10, segundo a máscara utilizada na aplicação dos filtros. O que pode ser observado é que quanto maior a
máscara utilizada, mais detalhes na imagem podem ser observados, isso é devido a uma maior banda
passante nas imagens resultantes. Embora haja mais detalhes nas imagens, com o aumento da máscara do
filtro, as linhas correspondentes as bordas da imagem ficam mais espessas, na aplicação sem reescalonamento.
Na aplicação do operador Laplaciano sem re-escalonamento da imagem resultante, figuras 3 a 6, ocorrem
problemas devido a multiplicação de valores muito altos pela máscara do filtro, então os valores de
intensidade dos pixels resultantes aumenta muito acima do valor máximo de 255. Ocasionando com isso
muitos valores que serão igualados ao valor de intensidade máxima de pixel, 255, pela aplicação do
operando “uint8” na imagem resultante.
Tabela I - Exemplo de aplicação do operador Laplaciano com máscara de 15x15
5453
2307
-1113
-3806
3058
2589
1339
-909
471
611
1092
1077
-1301
-2107
-1441
-106
Como pode ser visto na tabela I, que apresenta uma parte da imagem resultante após a aplicação do
operador Laplaciano, os valores de intensidade de pixels são muito altos. Todos os valores acima de 255
serão convertidos para esse valor. Esse efeito pode ser visto mais claramente com as máscaras de 9x9 e
15x15, figuras 5 e 6.
Com o uso de re-escalonamento do operador Laplaciano, divisão da máscara pela sua dimensão e somada
como valor de 128 (nível médio do valor zero), as imagens resultantes possuem valores mais suaves
visualizados na escala de cinza, figuras 7 a 10.
Re-escalonamento Æ máscara = KxK Æ Laplaciano (mascara, imagem)/K + 128;
Tabela II – Exemplo de aplicação do operador Laplaciano, re-escalado, com máscara de 15x15
153,09
138,25
122,96
111,08
141,59
139,51
133,95
123,96
130,09
130,72
132,85
132,79
122,22
118,64
121,6
127,53
A tabela II mostra a mesma área da imagem que a tabela I, podendo ser observado que os valores de
intensidade dos pixels está na faixa de 0 a 255.
Resultados - Imagens
Figura 2 – Imagem Original
Filtro 3x3
Filtro 5x5
Figura 3 – Filtro com máscara de 3x3
Figura 4 – Filtro com máscara de 5x5
Filtro 9x9
Filtro 15x15
Figura 5 - Filtro com máscara de 9x9
Figura 6 - Filtro com máscara de 15x15
Filtro 3x3
Figura 7 – Filtro re-escalado com máscara 3x3
Filtro 5x5
Figura 8 – Filtro re-escalado com máscara 5x5
Filtro 9x9
Figura 9 – Filtro re-escalado com máscara 9x9
Filtro 15x15
Figura 10 – Filtro re-escalado com máscara 15x15
Apêndice
Script de chamada dos filtros :
%projeto2.m
I=imread('imagem2.tif');
imshow(I),title('Imagem Original');
figure;
subplot(2,2,1),imshow(uint8(filtern(3,I))),title('Filtro 3x3');
subplot(2,2,2),imshow(uint8(filtern(5,I))),title('Filtro 5x5');
subplot(2,2,3),imshow(uint8(filtern(9,I))),title('Filtro 9x9');
subplot(2,2,4),imshow(uint8(filtern(15,I))),title('Filtro 15x15');
figure;
subplot(2,2,1),imshow(uint8(filtern(3,I)/9+128)),title('Filtro 3x3');
subplot(2,2,2),imshow(uint8(filtern(5,I)/25+128)),title('Filtro 5x5');
subplot(2,2,3),imshow(uint8(filtern(9,I)/81+128)),title('Filtro 9x9');
subplot(2,2,4),imshow(uint8(filtern(15,I)/225+128)),title('Filtro15x15
');
Função de aplicação da mascara:
function answ=filtern(n,img);
mascara=ones(n);
mascara(int8(n/2+1),int8(n/2+1))=-(n*n-1);
answ=filter2(mascara,img);
Download

Máscaras Laplacianas