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