1
INTRODUÇÃO A VISÃO COMPUTACIONAL COMPUTACIONAL USANDO MATLAB M ATLAB Tutorial Nielsen Castelo Damasceno 1 TIPOS DE IMAGENS Imagens de Intensidades: É uma Matriz de dados cujos valores representam as intensidades em cada ponto. Se os elementos de intensidade forem da classe uint8 seus valores estarão no intervalo [0, 255]. Se forem da classe uint16 seus valores variarão no intervalo [0, 65535]. Se os elementos forem da classe double, seus valores por convenção estarão no intervalo [0,1]. Imagens Binárias: É um arranjo lógico de zeros e uns onde os dados são da classe “logical”. Imagens Indexadas: Requerem duas Matrizes. Uma matriz (X) contém um valor numérico que é um índice para uma segunda matriz (map) formada pelas quantidades de cores R(Red – Vermelho) G(Green – Verde) B(Blue – Azul) para o pixel correspondente. Imagens RGB: São compostas por três matrizes separadas para cada cor R, G e B, normalizadas no intervalo [0,1]. 1.1 Convertendo uma Matriz para uma Imagem I magem de Intensidades Sintaxe: I = mat2gray(A,[amin amax]) I = mat2gray(A) Descrição: I = mat2gray(A,[amin amax]) Converte a Matriz A para a Imagem de Intensidades I. A Matriz A deve ser ser double. A Matriz I conterá conterá valores entre 0 (preto) e 1 (branco). Os Parâmetros amin e amax são os valores na Matriz A que corresponderão a 0 e 1 na Imagem I. I = mat2gray(A) Estabelece Estabelece os valores de de amin e amax como o mínimo e máximo dos valores da Matriz A.
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
2
Exercício Converter as Matrizes A, B, C, e D para Imagens de Intensidades e observar os resultados. A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] B = [ 16 3 2 4 20 30 4 4 5 6 7 8] C = [ 20,30 40; 50,40,10 80 20 15] D = [ 1,2,3,4;5 6 7 8 9999 8,8,8,8; 4 5,9 4] IA = mat2gray(A) IB = mat2gray(B, [2,30]) IC = mat2gray(C, [10,40]) ID = mat2gray(D, [0,10]) 1.2 Mostrando uma Imagem de Intensidades. Sintaxe: imshow(I,n) imshow(I,[low high]) Descrição: imshow(I,n) Mostra a Imagem de Intensidades I com n níveis discretos de cinza Se o valor de n for omitido, imshow usa 256 níveis de cinza em sistemas de 24-bits, ou 64 níveis de cinza em outros sistemas.
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
2
Exercício Converter as Matrizes A, B, C, e D para Imagens de Intensidades e observar os resultados. A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1] B = [ 16 3 2 4 20 30 4 4 5 6 7 8] C = [ 20,30 40; 50,40,10 80 20 15] D = [ 1,2,3,4;5 6 7 8 9999 8,8,8,8; 4 5,9 4] IA = mat2gray(A) IB = mat2gray(B, [2,30]) IC = mat2gray(C, [10,40]) ID = mat2gray(D, [0,10]) 1.2 Mostrando uma Imagem de Intensidades. Sintaxe: imshow(I,n) imshow(I,[low high]) Descrição: imshow(I,n) Mostra a Imagem de Intensidades I com n níveis discretos de cinza Se o valor de n for omitido, imshow usa 256 níveis de cinza em sistemas de 24-bits, ou 64 níveis de cinza em outros sistemas.
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
3
imshow(I,[low high]) Mostra a Imagem I em nível de cinza, especificando os limites dos valores de branco e preto. O parâmetro low (e qualquer valor menor do que ele) corresponde ao preto; o parâmetro high (e qualquer valor maior do que ele) é mostrado m ostrado como branco. Valores intermediários são mostrados em escala de cinza, usando o número padrão de níveis. Se usado uma matriz vazia entre colchetes([]) para os parâmetros [low high], a função imshow usa [min(I(:)) max(I(:))]; ou seja, o menor valor em I é mostrado como preto e o maior valor valor em I é mostrado como branco. Exercício Mostrar a imagem dada pela Matriz E em escala de cinza e observar os resultados. E = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25] IE = mat2gray(E) imshow(IE) 1.3 Convertendo uma Imagem de Intensidades para uma Imagem I magem Indexada. Sintaxe: [X,map] = gray2ind(I,n) Descrição: gray2ind coloca em escala e arredonda uma Imagem de Intensidades I produzindo uma Imagem Imagem Indexada Indexada equivalente. equivalente. [X,map] = gray2ind(I,n)
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
4
converte a Imagem de Intensidades I para uma Imagem Indexada X, com um mapa de n cores, indexada pelo parâmetro map. Se n for omitido, o default é 64. O valor de n deve ser um inteiro entre 1 e 65536. 1.4 Convertendo uma Imagem de Intensidades para uma Imagem Binária. Sintaxe: G = im2bw(f,T) Descrição: Gera uma Imagem Binária através de Limiarização (“Thresholding”). Os valores serão zero para intensidades menores que T e um para os outros pixels. O valor especificado para T deve estar no intervalo [0,1] independente da classe dos dados de entrada. A Imagem Binária de saída será da classe logical. (Se T for omitido será considerado T=0.5)
Ler e mostrar imagens verificando informações sobre elas. (Obs: Se o arquivo não estiver no diretório de trabalho é preciso informar o caminho, ou salvar a imagem no diretório de trabalho) f = imread(‘chestxray_gray.jpg’); (Obs: o ponto e vírgula (;) impede que os valores sejam mostrados na Janela de Comando do MatLab) Verificar o número de linhas e colunas da imagem: size(f) Atribuir os valores das linhas e colunas às variáveis M e N: [M,N] = size(f) Mostrar as informações da Matriz (Imagem): whos f Mostrar a Imagem: imshow(f) Ler uma segunda imagem de arquivo e mostrar as duas imagens lidas: g = imread(‘rose_gray.tif’); whos g imshow(f), figure, imshow(g)
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
5
Verificar o valor dos níveis nas coordenadas e a distância entre dois pixels: pixval (Obs: clicar com o botão direito do mouse sobre um pixel da figura, manter seguro e posicionar sobre outro pixel qualquer. O valor obtido é a distância entre os dois pixels). Gravando Imagens em Arquivos. Sintaxe: imwrite(f, ‘arquivo.tipo’) Descrição: A imagem f é salva em disco, no arquivo.tipo. Se a função não contiver o caminho, o arquivo é salvo no diretório de trabalho. Uma sintaxe da função imwrite, aplicável somente a imagens JPEG, é: imwrite(f, ‘arquivo.jpg’, ‘quality’, q) onde q é um inteiro entre 0 e 100. Quanto menor o valor de q maior a degradação devido à compressão JPEG. Exercício Salvar Imagens JPEG em arquivos e calcular a Taxa de Compressão. h = imread('bubbles.jpg'); imshow(h) imfinfo bubbles.jpg O Número de Bytes da imagem original é computado multiplicando-se Width x Height x BitDepth e dividindo-se o resultado por 8. A Taxa de Compressão da imagem é obtida dividindo-se o Número de Bytes da imagem original pelo parâmetro FileSize. a) Salvar a imagem bubbles.jpg com o nome de bubbles5.jpg , com q=5. b) Ler a imagem bubbles5.jpg e gerar a informação sobre ela através da função imfinfo bubbles5.jpg c) Mostrar as duas imagens, calcular a Taxa de Compressão de cada uma delas e concluir sobre o tamanho dos arquivos e sobre a qualidade de cada imagem.
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
6
Uma Variável de Estrutura pode ser usada para armazenar as informações da função imfinfo e assim calcular a Taxa de Compressão. Cada campo de informação é associado à Variável de Estrutura através de um ponto (.). Por exemplo, se a Variável de Estrutura for K, as informações de altura e largura da imagem serão K.Heigth e K.Width . Assim, a Taxa de Compressão da imagem pode ser calculada por: K = imfinfo(‘bubbles.jpg’); image_bytes = K.Width*K.Height*K.BitDepth/8; compress_ratio = image_bytes/K.FileSize Uma sintaxe da função imwrite, aplicável somente a imagens TIF, é: imwrite(f, ‘arquivo.tif’, ‘compression’, ‘parameter’, ‘resolution’, [colres rowres]) onde: ‘parameter’ pode ter um dos seguintes valores: • ‘none’ - indicando não compressão. • ‘packbits’ - indicando compressão do tipo packbits (default para imagens não binárias). • ‘ccitt’ - indicando compressão tipo ccitt (default para imagens binárias). O array (1x2) [colres rowres] contém dois inteiros que fornecem a resolução das colunas e das linhas em dpi (dots-per-inch). Os valores defaults são [72 72]. Por exemplo, se as dimensões da imagem são em polegadas, colres é o número de pixels (ou pontos) por polegadas (dpi) na direção vertical, e rowres é a dpi na direção horizontal. Exercício Salvar Imagens TIF em arquivos, alterando a resolução espacial. O arquivo circuit.jpg é uma imagem em nível de cinza de 8 bits, 72 dpi de resolução espacial, tamanho de 450 x 450 píxels em uma dimensão de 6,25 x 6,25 polegadas. (res = 450/6,25 = 72 dpi) Ler a imagem e verificar suas características: f = imread('circuit.jpg'); imfinfo circuit.jpg Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
7
Salvar a imagem no formato TIF, sem compressão, reduzindo sua dimensão para 2,5 x 2,5 polegadas e mantendo seu tamanho em 450 x 450 píxels. Logo, a nova resolução espacial deverá ser: res2 = 450/2,5 = 180 dpi Verificar suas características. imwrite(f, ‘circuit.tif’, ‘compression’, ‘none’, ‘resolution’, [180 180]) imfinfo circuit.tif Mostrar as duas imagens e responder: a) O que aconteceu com as dimensões das imagens? b) Explicar o que é Resolução Espacial da imagem. c) Qual o tamanho dos dois arquivos em bytes? 1.5 Indexando Imagens Como imagens são matrizes, os esquemas de indexação de matrizes podem ser usados diretamente nas imagens. Exercício Alterar imagens através da indexação. O arquivo rose_gray.tif é uma imagem em nível de cinza de 8 bits, classe uint8, tamanho de 263 x 264 píxels. Digitar os comandos e verificar o que cada esquema de indexação faz. f = imread(‘rose_gray.tif’); imshow(f) whos f fp = f(end:-1:1,:); fl = f(:,end:-1:1); imshow(f), figure, imshow(fp), figure, imshow(fl) fc = f(65:198, 65:198); fs = f(1:2:end, 1:2:end); imshow(f), figure, imshow(fc), figure, imshow(fs) Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
8
plot(f(132,:)) 2 HISTOGRAMA Compreender o que são, como funcionam, e se familiarizar com os histogramas são provavelmente os passos mais importantes para trabalhar com imagens de uma câmera digital. Um histograma pode dizer se a imagem foi exposta corretamente, se o tipo de luz era dura ou suave e quais ajustes funcionam melhor em sua câmera. Esse conhecimento não só melhora as suas habilidades no computador, mas como fotógrafo também. Cada pixel de uma imagem tem uma cor que foi produzida por uma combinação de cores primárias (vermelho, verde e azul, ou RGB). Cada uma dessas cores pode ter um brilho que varia de 0 a 255 em uma imagem digital com profundidade de bits de 8-bits. Um histograma RGB é produzido quando o computador varre a imagem em cada um desses valores de brilho RGB e conta quantos pixels há em cada nível de 0 a 255. Outros tipos de histogramas existem, mas todos têm mais ou menos a mesma representação da figura 1:
Figura 1 – Histograma de uma imagem RGB. 2.1 Tons A região onde a maioria dos valores tonais se encontra é chamada de "gama tonal". A gama tonal pode variar drasticamente de uma imagem para outra, então desenvolver uma intuição em relação a como os números se transformam em valores de brilho é crítico -- ambos antes e depois da foto ser tirada. Não há um "histograma ideal" ao qual as imagens devem seguir; o histograma deve simplesmente seguir a gama tonal que o fotógrafo deseja transmitir. Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
9
Figura 2 – Informações sobre os tons da imagem. A figura 2 é um exemplo que contém uma gama tonal bem ampla, com marcadores que ilustram onde regiões na cena representam os níveis de brilho no histograma. Essa cena costeira contém poucos meios-tons, mas tem grandes regiões de sombras e altas-luzes no canto inferior esquerdo e no superior direito, respectivamente. Isso resulta num histograma que tem uma alta contagem de pixels nos extremos esquerdo e direito. A luz normalmente não é tão extrema quanto no exemplo anterior. Condições de luz normal e bem distribuída, quando combinadas com um sujeito bem exposto, normalmente produzem um histograma cujo pico encontra-se no centro e que gradualmente diminui em direção às regiões de alta e baixa luzes aos lados. Com exceção da luz do sol refletida diretamente no topo do prédio e algumas janelas, a cena com o barco ao lado possui luz bem distribuída. A maioria das câmeras não encontrará problemas para reproduzir automaticamente uma imagem que possui histograma similar ao mostrado abaixo.
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
10
Figura 3 – Histograma com condições de luz normal. 2.2 Imagens com 'low key' e 'high key' Apesar da maioria das câmeras, quando no modo automático, produzirem histogramas com pico no meio-tom, a distribuição dos picos num histograma depende da gama tonal da imagem. Imagens onde a maioria dos tons está na região das baixas luzes (ou sombras) são chamadas de 'low key' (uma tradução literal seria 'chave baixa', mas o termo normalmente não é traduzido), enquanto que imagens com 'high key' (chaves altas) têm a maioria dos tons nos brilhos.
Figura 4 – Imagem Low key.
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
11
Figura 5 – Imagem High key. Antes de tirar uma foto, é útil determinar se o sujeito se qualifica como 'low' ou 'high key'. Já que as câmeras medem a luz refletida, elas são incapazes de dizer o brilho absoluto dos sujeitos da imagem. Como resultado, muitas câmeras possuem algoritmos avançados para esquivar essa limitação, e estimar quanto brilho a imagem deve ter. Essas estimativas normalmente produzem imagens cujo brilho médio encontra-se nos meios-tons. Isso é, frequentemente, aceitável, mas cenas com 'low' ou 'high key' pronunciados necessitam de ajustes de exposição manuais do fotógrafo para corrigir o palpite da câmera. Uma boa regra para ter em mente é: você normalmente precisa ajustar a exposição quando quer que o brilho médio das suas imagens esteja mais escuro ou mais claro que os meios-tons. O seguinte grupo de imagens (Figura 6 e 7) é o resultado obtido automaticamente pela câmera para as fotos mostradas anteriormente. Note como a média de contagem de pixels é trazida para os meios-tons.
Figura 6 – Imagem com média de contagem de pixel tendendo para meiostons.
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
12
Figura 7 – Imagem High key trazida para meios-tons A maioria das câmeras digitais são melhores reproduzindo cenas com 'low key' pois elas previnem que qualquer região da imagem tenha brilho suficiente para se tornar branco puro, independente de quão escuro o resto da imagem possa resultar. Cenas com 'high key', por outro lado, normalmente resultam em imagens significativamente sub-expostas. Mas é mais fácil lidar com regiões sub-expostas do que com as super-expostas (apesar disso comprometer a razão entre o sinal e o ruído). O detalhe não pode ser recuperado caso a região esteja super-exposta a ponto de ser branco puro. Quando isso ocorre a alta luz é dita estar 'estourada' ou 'cortada'.
Figura 8 – Figura com alta-luz cortada. O histograma é uma boa ferramenta para saber se o corte ocorreu, já que é possível ver diretamente se o brilho está empurrado para um dos lados do gráfico. Um pouco de corte pode ser normal em regiões como reflexões especulares na água ou meta, ou quando o sol ou outras fontes luminosas muito fortes estão enquadradas. Em última análise, a quantidade de corte depende do fotógrafo e o que ele deseja transmitir.
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
13
2.3 Contraste Um histograma também pode descrever quanto contraste há numa imagem. Contraste é uma medida da diferença de brilho entre as áreas claras e escuras de uma cena. Histogramas largos são típicos de cenas com bastante contraste, enquanto histogramas estreitos são de imagens com menos contraste e que podem aparentar achatadas ou sem graça. Isso pode ser causado por uma combinação de fatores de luz e sujeito. Fotos tiradas em condição de neblina ou fumaça terão baixo contraste; fotos tiradas sob sol forte, por outro lado, terão contraste muito mais alto.
Figura 9 – Imagens com alto contraste e baixo contraste. O contraste pode ter um impacto visual muito grande ao enfatizar texturas, como mostrado na imagem acima. O alto contraste da água tem sombras mais profundas e brilhos mais pronunciados, criando texturas que saltam aos olhos de quem as observa. O contraste também pode variar de acordo com a região de uma mesma imagem se houver diferentes condições de luz e sujeito nela. Podemos dividir a imagem do barco mostrada anteriormente em três regiões -- cada uma com um histograma diferente.
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
14
Figura 10 – Imagens com diferentes contrastes. A região no topo da figura 10 contém mais contraste que as outras três pois a imagem é criada a partir de luz que reflete diretamente dos objetos. Isso produz sombras mais profundas logo abaixo do barco e brilhos mais fortes nas áreas acima e expostas. As regiões do meio e de baixo são inteiramente produzidas por luz difusa, luz refletida da superfície da água e, por isso, têm menos contraste; como se a foto fosse tirada sob neblina. A região de baixo tem mais contraste do que a do meio -- apesar de apresentar um céu com um só tom de azul -- isso porque ela contém uma combinação de sombra e luz intensa do sol. As condições de luz na parte de baixo criam brilhos mais pronunciados, mas mesmo assim ela não apresenta as sombras profundas da região do topo. A soma dos histogramas das três regiões produz o histograma geral mostrado anteriormente. Exercício Ler a imagem mammogram.bmp e gerar seu histograma. f = imread('mammogram.bmp'); imfinfo mammogram.bmp imshow(f) imhist(f)
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
15
3 TRANSFORMAÇÃO DE INTENSIDADES As técnicas de processamento no domínio espacial operam diretamente nos pixels da imagem. A expressão geral para a Função de Transformação nos níveis de cinza pode ser dada por: g ( x, y ) = T [ f ( x, y )]
onde
f ( x, y )
é a imagem de entrada e g(x,y) é a imagem de saída ou imagem
processada. T é um operador em f. A função do MatLab que realiza transformações de intensidade nos níveis de cinza de uma imagem é a imadjust que tem a seguinte sintaxe: g = imadjust(f, [low_in high_in], [low_out high_out], gamma) Exercício Mostrar graficamente a Função de Transformação de Intensidades T[f(x,y)] e a imagem gerada em cada um dos exemplos. a) g1 = imadjust(f, [0 1], [1 0]) b) g2 = imadjust(f, [0.5 0.75], [0 1]) c) g3 = imadjust(f, [ ], [ ], 2)
4 EQUALIZAÇÃO DO HISTOGRAMA A equalização de histogramas no MatLab é implementada através da função: g
=
histeq( f , nlev)
onde f é a imagem de entrada e nlev é o número de níveis de intensidades especificados para a imagem de saída. Exercício Equalizar a imagem polem.bmp g = imread('polem.bmp'); figure, imshow(g) figure, imhist(g) ylim('auto') geq = histeq(g,256);
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
16
figure, imshow(geq) figure, imhist(geq) ylim('auto') A Função de Transformação da Equalização de Histograma é a Soma Cumulativa dos valores do histograma normalizado. Esta Função de Transformação transforma uma estreita faixa de níveis de intensidade de entrada em uma escala completa de níveis de intensidade de saída. Executar e explicar o código de MatLab abaixo tanto relativo ao resultado obtido como a função de cada linha de comando. g = imread('polem.bmp'); figure, imshow(g) figure,imhist(g) ylim('auto') hnorm = imhist(g)./numel(g); cdf = cumsum(hnorm); x = linspace(0, 1, 256); figure,plot(x,cdf) axis([0 1 0 1]) set(gca, 'xtick', 0:.2:1) set(gca, 'ytick', 0:.2:1) xlabel('Valores de Intensidade de Entrada', 'fontsize', 9) ylabel('Valores de Intensidade de Saída', 'fontsize', 9) text(0.18, 0.5, 'Função de Transfomação', 'fontsize', 9) 5 SUBTRAÇÃO DE IMAGENS Subtrair a imagem do fundo g1 = imread('Image2.bmp') g2 = imread('Image3.bmp') g3 = imabsdiff(g2,g1); g4 = imcomplement(g3); figure('Name', 'Imagem Original'),imshow(g1) figure('Name', 'Histograma da Imagem Original'), imhist(g1) Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
17
figure('Name','Imagem do Fundo'), imshow(g2) figure('Name','Histograma da Imagem do Fundo'), imhist(g2) figure('Name', 'Imagem Diferença'), imshow(g3) figure('Name', 'Histograma da Imagem Diferença'), imhist(g3) figure('Name','Imagem resultado da subtração complementada'), imshow(g4) figure('Name','Histograma da Imagem complementada'), imhist(g4) 6 FILTRAGEM ESPACIAL: FILTRO PASSA BAIXA E PASSA ALTA O Toolbox de Processamento de Imagens do MATLAB implementa a Filtragem Espacial Linear através da função imfilter que possui a seguinte sintaxe: g = imfilter(f,w, filtering_mode, boundary_options, size_options) onde f é a imagem de entrada, w é a máscara do filtro e g é a imagem resultante. Os outros parâmetros podem ser observados utilizando o help do Matlab. O filtro da Mediana pode ser implementado através da função medfilt2 cuja sintaxe é: g = medfilt2(f, [m n], padopt) Onde [m n] define a vizinhança para a Mediana e padopt é a opção de borda da imagem (padopt = ‘zeros’ - default, ‘symmetric’ a imagem é considerada simétrica em suas bordas, ‘indexed’ a borad é considerada 1 se f for da classe doublé e 0 caso contrário). Exercício Suavização – Filtragem espacial passa baixa. Para a imagem Lena_ruido.bmp. a) Filtrá-la através da Média de Vizinhança 5x5, 7x7, 9x9, 25x25, 31x31 b) Filtrá-la através da Mediana 5 x 5, 7x7 c) Filtrá-la através Média dos k-vizinhos de 25 (fazer k= 9,15,20) Concluir a respeito das 3 metodologias. O Toolbox de Processamento de Imagens do MATLAB implementa também filtros 2-D pré-definidos através da função fspecial que gera uma máscara de filtro w através da seguinte sintaxe: Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
18
w = fspecial(‘type’, parameters) Onde ‘type’ especifica o tipo do filtro e parameters são definidos pelo filtro especificado. Exercício Laplaciano – Filtro Passa Alta (Image Enhancement). Para a imagem da Moon.tif, aplicar o filtro Laplaciano e um filtro passa alta. f = imread('Moon.tif'); w4 = fspecial('laplacian',0); w8 = [1 1 1; 1 -8 1; 1 1 1]; f = im2double(f); g4 = f - imfilter(f, w4, 'replicate'); g8 = f - imfilter(f, w8, 'replicate'); imshow(f) figure, imshow(g4) figure, imshow(g8) 7 MÉDIA DE MÚLTIPLAS IMAGENS Uma imagem pode ser corrompida com ruído. A função do MATLAB que contamina uma imagem com ruído é a imnoise que tem a seguinte sintaxe: fn = imnoise(f, type, parameters) Onde f é a imagem original e type é o tipo de ruído. Exercício Média de Múltiplas Imagens. A partir da imagem original da ferramentas.bmp, contaminá-la com ruído ‘salt & pepper’ com 60% de probabilidade de ocorrência e fazer a média das imagens ruidosas. k = imread('ferramentas.bmp'); f = im2double(k); f1 = imnoise(f,'salt & pepper', 0.6); f2 = imnoise(f,'salt & pepper', 0.6); f3 = imnoise(f,'salt & pepper', 0.6); f4 = imnoise(f,'salt & pepper', 0.6); f5 = imnoise(f,'salt & pepper', 0.6); f6 = imnoise(f,'salt & pepper', 0.6); Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
19
f7 = imnoise(f,'salt & pepper', 0.6); f8 = imnoise(f,'salt & pepper', 0.6); f9 = imnoise(f,'salt & pepper', 0.6); f10 = imnoise(f,'salt & pepper', 0.6); fm = (f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10)/10; subplot(2,3,1);imshow(f) subplot(2,3,2);imshow(f1) subplot(2,3,3);imshow(f2) subplot(2,3,4);imshow(f3) subplot(2,3,5);imshow(f4) subplot(2,3,6);imshow(f5) figure subplot(2,3,1);imshow(f6) subplot(2,3,2);imshow(f7) subplot(2,3,3);imshow(f8) subplot(2,3,4);imshow(f9) subplot(2,3,5);imshow(f10) subplot(2,3,6);imshow(fm) Imagens RGB Decompor a imagem Flor.bmp em suas três componentes RGB. f = imread('Flor.bmp'); fR = f(:, :, 1); fG = f(:, :, 2); fB = f(:, :, 3); subplot(2,3,1);imshow(f) subplot(2,3,2);imshow(fR) subplot(2,3,3);imshow(fG) subplot(2,3,4);imshow(fB) Gerar a imagem RGB a partir de suas três componentes. g = cat(3, fR, fG, fB); subplot(2,3,1);imshow(fR) subplot(2,3,2);imshow(fG) subplot(2,3,3);imshow(fB) Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
20
subplot(2,3,4);imshow(g) Imagens Indexadas Uma Imagem Indexada no MATLAB tem dois componentes: a)Uma Matriz de Dados Inteiros (X); b)Uma Matriz de cor (map). A Matriz map é um arranjo de m x 3 elementos de classe double contendo valores em ponto-flutuante no intervalo [0,1]. O comprimento m do map é igual ao número de cores definido. Cada linha da Matriz map especifica o valor de R,G,B de uma cor na Matriz X. Ou seja, um Pixel de cor em X é um ponteiro para sua cor RGB em map. Exercício Converter uma imagem RGB em uma imagem Indexada. RGB = imread('peppers.png'); [X,map] = rgb2ind(RGB,256); figure imshow(X,map) Para alterar o número de cores de uma imagem indexada pode-se usar a função imapprox que tem a seguinte sintaxe: [Y, newmap] = imapprox(X, map, n) onde n é o número de cores da nova imagem. 8 CONVERSÃO DE RGB PARA OUTROS ESPAÇOS DE CORES RGB para o NTSC: A função rgb2ntsc realiza esta conversão e a função ntsc2rgb faz a re-conversão. Exercício Converter a imagem RGB em NTSC e gerar separadamente as componentes de Luminância, Matiz e Saturação. YIQ = rgb2ntsc(RGB); subplot(2,2,1);imshow(YIQ) subplot(2,2,2);imshow(YIQ(:,:,1)) Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
21
subplot(2,2,3);imshow(YIQ(:,:,2)) subplot(2,2,4);imshow(YIQ(:,:,3)) RGB para YCbCr: A função rgb2ycbcr realiza esta conversão e a função ycbcr2rgb faz a re-conversão. RGB para HSV: A função rgb2hsv realiza esta conversão e a função hsv2rgb faz a re-conversão. RGB para CMY: A função imcomplement realiza a conversão entre os dois espaços de cores. RGB para HSI: O Matlab não possui esta função implementada em seu Toolbox. Para fazer esta conversão copiar o arquivo rgb2hsi.p e hsi2rgb.p para o diretório work . 9 FILTRAGEM ESPACIAL DE IMAGENS COLORIDAS Para aplicar um filtro em uma imagem RGB deve-se: 1) Extrair as três componentes. R = RGB(:,:,1); G = RGB(:,:,2); B = RGB(:,:,3) 2) Filtrar cada componente individualmente RF = imfilter(R,w); GF = imfilter(G,w); BF = imfilter(B,w); 3) Reconstruir a imagem filtrada em RGB RGBF = cat(3,RF,GF,BF) Ou pode-se filtrar diretamente a imagem RGB como se esta fosse em escala de cinza. RGBF = imfilter(RGB,w) 10 TRABALHANDO DIRETAMENTE NO ESPAÇO VETORIAL RGB Detecção de bordas em Imagens RGB. Copiar o arquivo colorgrad.p para o diretório work. A função colorgrad implementa o gradiente em imagens RGB com a seguinte sintaxe: [VG, A, PPG] = colorgrad(f, T) onde: f é a Imagem RGB T é um Threshold opcional no intervalo [0 1] – o default é zero. VG é o Vetor Gradiente RGB (Magnitude) A é o ângulo do vetor gradiente em radianos PPG é o gradiente formado através da detecção de bordas nas componentes individuais. O detector utilizado é o de Sobel. Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
22
11 MORFOLOGIA MATEMÁTICA (Operações Morfológicas em Imagens Binárias) 11.1 Dilatação e Erosão A função do MatLab que realiza a Dilatação de uma imagem tem a seguinte sintaxe: A2 = imdilate(A,B) Onde A e A2 são imagens Binárias e B é o elemento estruturante formado por uma matriz de zeros e uns. Exercício Dilatar a imagem broken_text.tif usando o seguinte elemento estruturante: 0 1 0 B = 1 1 1 0 1 0 A = imread('broken_text.tif'); B = [0 1 0; 1 1 1; 0 1 0]; A2 = imdilate(A,B); subplot(1,2,1);imshow(A) subplot(1,2,2);imshow(A2)
A Erosão é realizada pela função imerode cuja sintaxe é: IM2 = imerode(IM, SE) . Onde SE é o elemento estruturante retornado pela função strel, ou formado por uma matriz de zeros e uns. Exercício Erodir a imagem da Figura circles.png usando um elemento estruturante em forma de disco de raio 11: Imagem_Original = imread('circles.png'); se = strel('disk',11); Imagem_Erodida = imerode(Imagem_Original,se); imview(Imagem_Original), imview(Imagem_Erodida)
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
23
11.2 ABERTURA E FECHAMENTO As operações morfológicas de Abertura e Fechamento são implementadas pelo MatLab através das funções imopen e imclose cujas sintaxes são: O = imopen(A,B), C = imclose(A,B). Onde A é uma imagem binária e B é o elemento estruturante formado por uma matriz de zeros e uns ou gerado através da função strel. 11.3 OPERAÇÕES MORFOLÓGICAS EM IMAGENS EM ESCALA DE CINZA As operações morfológicas em escala de cinza podem ser realizadas com um Elemento Estruturante ‘flat’, gerado para a função strel, ou pode ser ‘não-flat’. A sintaxe para gerar um elemento “não-flat” em forma de “bola” é: SE = strel('ball',R,H,N) Que cria um elemento estruturante elipsoide no plano X-Y com raio R e altura H. N é um valor que gera a aproximação para o elemento; o default é N=8. Outra forma de gerar um elemento estruturante “não-flat” é gera-lo através da função: SE = strel(NHOOD,HEIGHT) Onde NHOOD é uma vizinhança binária de zeros e uns e HEIGHT é uma matriz da mesma dimensão de NHOOD com os valores associados a cada valor não zero de NHOOD. 12 SEGMENTAÇÃO O processo de segmentação de uma imagem digital consiste em subdividir uma dada imagem em regiões ou objetos com base em características destas regiões. Estas regiões são compostas por um conjunto de pixels com propriedades semelhantes. O nível de subdivisão é determinado pela aplicação especifica. 12.1 Detecção de pontos isolados O próximo experimento apresenta 3 pontos brancos isolados na imagem points.tif quase imperceptíveis que podem ser detectados com um filtro do tipo: − 1 w = −1 − 1
8 −1 −1 − 1 −1
−1
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
24
Exercício Detectar os pontos isolados da Imagem points.tif. f = imread('point.tif'); fg = rgb2gray(f) w = [-1 -1 -1; -1 8 -1; -1 -1 -1]; g = imfilter(fg,w); BW = im2bw(g); imview(fg) imview(BW)
12.2 DETECÇÃO DE LINHAS Linhas Verticais, Horizontais ou em ±45 o podem ser detectadas através da convolução da imagem com templates do tipo:
Exercício Detectar linhas em –45º da Imagem 'wirebond_mask.tif'. f1 = imread('wirebond_mask.tif'); w = [ 2 -1 -1; -1 2 -1; -1 -1 2]; g1 = imfilter(double(f1),w); T = max(g1(:)); g1 = g1>=T-40 imview(f1, []) imview(g1)
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail:
[email protected]
25
12.3 DETECÇÃO DE BORDAS O Toolbox de Processamento de Imagens do MatLab possui uma função que realiza a detecção de bordas. A sintaxe desta função é: [ g, t ] = edge(f, ‘method’, parameters) Onde f é a Imagem de entrada, g é a Imagem de saída (arranjo lógico com 1 nas posições de bordas detectadas e 0 nas demais) e ‘method’ corresponde ao tipo de detector utilizado. O valor de t é opcional e corresponde ao Threshold que a função utilizará para definir uma borda. A sintaxe para o Detector de Sobel usando a função edge é: [ g, t ] = edge(f, ‘sobel’, T, dir) onde T é um Threshold especificado e dir dá a direção preferencial das bordas detectadas (vertical, horizontal, ou both (default)). Se T é especificado então t = T. Se T não for especificado, a função edge usa um Threshold automático e retorna seu valor em t. Exercício Aplicar o Detector de Bordas de Sobel na imagem e obter o valor de t. f2 = imread('igreja.tif'); [g2,t]=edge(f2,'sobel'); imview(f2), imview(g2) As sintaxes da função edge, para os Detectores de Roberts e de Prewitt , são idênticas à sintaxe do Detector de Sobel. Repetir o exercício anterior e utilizar os detectores de Roberts e de Prewitt. Comparar os resultados com o Detector de Sobel. O detector de bordas LoG (Laplaciano da Gaussiana) tem a seguinte sintaxe usando a função edge: [ g, t ] = edge(f, ‘log’, T, sigma),
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
26
onde sigma é o desvio padrão relacionado à suavização realizada pela Gaussiana. O valor default para sigma é 2. T é um Threshold especificado. Fazer T = 0 produz bordas em contornos fechados, característica da metodologia LoG. A sintaxe para o Detector de Bordas de Canny através da função edge, é: [ g, t ] = edge(f, ‘canny’, T, sigma), onde T é um vetor T = [T1, T2] contendo os dois valores de Threshold e sigma é o desvio padrão do filtro de suavização. O default para sigma é 1. 12.4 TRANSFORMADA DE HOUGH (HT) Não existe no Toolbox de Processamento de Imagens do MatLab uma função que implemente diretamente a HT. O livro “Gonzalez, R.C.; Woods,R.E.; Eddins,S.L. Digital Image Processing Using MATLAB” publicou funções para realizar a HT para retas, facilitando inclusive a localização dos segmentos de retas nas imagens gradiente. As funções hough.p, houghpeaks.p, houghpixels.p e houghlines.p devem ser copiadas para seu diretório de trabalho. A função hough tem a seguinte sintaxe: [H, theta, rho] = hough(f, dtheta, drho) Computa a HT da imagem f gerando o Arranjo Acumulador H com espaçamento entre as células dado por dtheta e drho. Se omitidos dtheta = 1 e drho = 1. Exercício Calcular a HT na imagem obtendo as senóides geradas no plano de parâmetros. f2 = imread('pontos.tif'); figure, imshow(f2) [H, theta, rho] = hough(f2); imshow(theta, rho, H, 'notruesize') axis on, axis normal xlabel('\theta'), ylabel('\rho') A função que detecta os picos no Arranjo Acumulador gerado pela HT é a houghpeaks que tem a seguinte sintaxe: [r, c, hnew] = houghpeaks( H, numpeaks, threshold, nhood), Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
27
que detecta picos na matriz H (Arranjo Acumulador) . numpeaks especifica o máximo número de localização de picos ( o default é 1 ). Valores de H abaixo do threshold não serão considerados picos. nhood é um vetor de 2 elementos especificando o tamanho da vizinhança de supressão, ou seja, o tamanho da vizinhança do pico encontrado que será zerada após a localização de cada pico. hnew é o Arranjo Acumulador com as vizinhanças de pico suprimidas. r e c são as coordenadas de linha(r) e coluna(c) dos picos identificados. Exercício Marcar os picos do Arranjo Acumulador da HT realizada na imagem. f2 = imread('pontos.tif'); figure, imshow(f2) [H, theta, rho] = hough(f2); imshow(theta, rho, H, 'notruesize') axis on, axis normal xlabel('\theta'), ylabel('\rho') [r, c] = houghpeaks(H,6,3); hold on plot(theta(c), rho(r), 'linestyle','none','marker','s','color','b') Como a HT determina as retas que passam pelos pontos determinados no Arranjo Acumulador, duas funções são utilizadas para calcular os segmentos de retas entre os pontos. Estas funções são a hougpixels e a houghlines. A sintaxe da função houghlines (que usa a houghpixels) é: lines = houghlines(f, theta, rho, rr, cc, fillgap, minlength) onde f é a imagem gradiente original, theta e rho são os vetores retornados pela função hough. rr e cc são vetores que especificam as linhas e colunas do Arranjo Acumulador para se procurar por segmentos de linhas. fillgap é o intervalo entre as células do Arranjo Acumulador associados com a mesma reta e serão fundidas em um mesmo segmento de reta (default é 20). Segmentos de linhas fundidos menores do que minlength (default = 40 pixels) são descartados. lines é um arranjo de estrutura cujo comprimento é igual ao número de segmentos fundidos encontrados. Cada elemento da estrutura tem os seguintes campos: point1 - Ponto-final do segmento de linha; vetor de dois elementos point2 - Ponto-final do segmento de linha; vetor de dois elementos Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
28
length - Distância entre o point1 e o point2 theta - Ângulo em graus da célula da HT rho - Posição de rho na célula da HT Exercício Detectar os segmentos de retas mais significativos na imagem através da Transformada de Hough (HT) implementadas pelas funções fornecidas. f2 = imread('madeira.tif'); g2=edge(f2,'canny',[0.06 0.5], 1.5); imview(g2) [H, theta, rho] = hough(g2); imshow(theta, rho, H, 'notruesize') axis on, axis normal xlabel('\theta'), ylabel('\rho') [r, c] = houghpeaks(H,10,10); hold on plot(theta(c), rho(r), 'linestyle','none','marker','s','color','b') lines = houghlines(g2, theta, rho, r, c); figure,imshow(f2) hold on for k = 1:length(lines) xy = [lines(k).point1; lines(k).point2]; plot(xy(:,2), xy(:,1), 'LineWidth', 2,'color', 'b'); end 12.5 THRESHOLDING (LIMIARIZAÇÃO) O MatLab possui uma função que calcula o Threshold Automático de uma imagem através do método de Otsu. Esta função tem a seguinte sintaxe: T = graythresh(I) Onde I é a imagem de classe uint8, uint16, ou double e T é o nível de limiar calculado entre [0, 1]. Exercicio
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
29
Implementar o Algoritmo de Threshold Automático (Gonzalez;Woods,2002) dado em classe, para a imagem: f = imread('texto.bmp'); hf = imhist(f); figure, imshow(f), figure, plot(hf) T1 = 0.5*(double(min(f(:)))+double(max(f(:)))); done = false; while ~done g = f >= T1; T1next = 0.5*(mean(f(g)) + mean(f(~g))); done = abs(T1 - T1next) < 0.5; T1 = T1next; end T2 = T1/255 s1 = im2bw(f,T2); figure, imshow(s1) 12.6 CRESCIMENTO DE REGIÃO O Toolbox de Processamento de Imagens do MatLab não possui uma função para Crescimento de Região. O livro (Gonzalez;Woods;Eddins,2004) tem uma função para realizar o Crescimento de Região ( regiongrow.p) cuja sintaxe é: [g, NR, SI, TI] = regiongrow(f, S, T), onde f é a Imagem de entrada, S o conjunto de Sementes e T o Threshold a ser aplicado na Imagem. Se S for uma Matriz, ela deve conter 1 nas coordenadas das Sementes e 0 no resto.Se S for um escalar ele define um valor de intensidade para as Sementes na imagem f. Se T for uma Matriz, ele deve conter o valor de Threshold em cada coordenada de f. Se T for um escalar ele define um Threshold Global para a imagem. O valor do Threshold T serve para verificar a diferença de intensidades entre o pixel 8-conectado e a Semente. 12.7 TRANSFORMADA WATERSHED
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
30
Implementar o programa abaixo e explicar em cada linha o que foi realizado e o porque, para gerar a Transformada Watershed que segmenta a imagem. f = imread('objetos1.bmp'); g = im2bw(f, graythresh(f)); gc = ~g D = bwdist(gc); L = watershed(-D); w = L == 0; g2 = g | w; subplot(2,2,1);imshow(f) subplot(2,2,2);imshow(g) subplot(2,2,3);imshow(gc) subplot(2,2,4);imshow(w) imview(g2) 13 REPRESENTAÇÃO E DESCRIÇÃO DE ESTRUTURAS BI-DIMENSIONAIS 13.1 Arranjo de Células e Estruturas no MatLab Um Arranjo de Células providenciam um meio para combinar um conjunto misto de objetos (ex: números, caracteres, matrizes, outros arranjos de células) em um mesmo nome de variável. Estas entidades dissimilares podem ser organizadas em uma única variável da seguinte maneira: C = { f, b, char_array} Onde as chaves { } designam o conteúdo do Arranjo de Células, f pode ser uma imagem de 512 x 512 píxels da classe uint8; b pode ser uma seqüência de coordenadas na forma de um arranjo de 188 x 2 e char_array um outro Arranjo de Células com dois nomes, por exemplo, char_array = { ‘area’, ‘centroide’}. Para endereçar o conteúdo de um elemento do arranjo deve-se incluir a posição do elemento entre chaves. Exemplo: C{3} = ‘area’ ‘centroide’. A função celldisp do MatLab mostra os elementos do Arranjo de Células: >> celldisp(C{3}) ans{1} = Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
31
area ans{2} = centroide Para trabalhar com um conteúdo específico do Arranjo de Células, deve-se extrair a variável do arranjo: f = C{1} extrai a imagem f (512x512) do arranjo. Exercício Escrever a função image_stats abaixo e salvar como arquivo m no diretório de trabalho: function G = image_stats(f) G{1} = size(f); G{2} = mean2(f); G{3} = mean(f,2); G{4} = mean(f,1); end Obter os elementos independentes do Arranjo de Células image_stats aplicado sobre a imagem. f = imread('listras.bmp'); imview(f) G = image_stats(f); G{1} G{2} G{3} G{4} 13.2 ESTRUTURAS NO MATLAB (NÃO CONFUNDIR COM ESTRUTURAS BIDIMENSIONAIS)
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
32
As Estruturas são semelhantes aos Arranjos de Células com a diferença que ao invés de serem endereçadas por números, as Estruturas são endereçadas por campos. Escrever a função image_stats2 abaixo e salvar como arquivo m no diretório de trabalho: function s = image_stats2(f) s.dim = size(f); s.AI = mean2(f); s.AIrows = mean(f,2); s.AIcols = mean(f,1); end Exercício Obter os elementos independentes do Arranjo de Células image_stats aplicado sobre a imagem. f = imread('listras.bmp'); imview(f) s = image_stats2(f); s.dim s.AI s.AIrows s.AIcols 14 MEDIDA DE DISTÂNCIA A Distância Euclidiana entre dois vetores n-dimensionais x e y é definida como o escalar: d e ( x, y ) = x − y
=
y − x
=
[( x
− 1
2
y1 )
+
L + ( xn
−
yn )
]
2 1 / 2
A expressão anterior é a Norma da diferença entre os vetores e pode ser computada através da função do MatLab: d = norm(x – y) Exercício
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
33
Considerar o Vetor de Características y = [53 23 44 55 02 13] padrão gerado através do processamento de uma imagem e o Vetor de Características x = [53 23 43 55 02 13] padrão este armazenado. Calcular a Distância Euclidiana entre os dois padrões. Quando existem diversos padrões armazenados (por exemplo, representativos de uma base de imagens) estes podem ser descritos através de uma Matriz X ( pxn) , onde p é o número de padrões e n é o número de característica de cada padrão. Exemplo: A Matriz abaixo apresenta um conjunto de 10 Vetores de Características (Padrões) referentes a 10 imagens de uma base. Cada vetor possui 6 características (ou descritores) extraídos de cada uma das imagens.
X = [41 05 04 52 30 33; ... 09 39 37 49 43 41; ... 36 30 10 11 29 47; ... 06 59 42 27 01 05; ... 01 19 46 06 16 02; ... 19 40 07 13 22 47; ... 56 38 21 20 03 05; ... 53 17 38 04 47 37; ... 55 43 56 54 08 60; ... 25 04 18 57 21 38]; Considerando que o Vetor de Características y deve ser verificado se existe na base ou se existe um Vetor na Base que mais se aproxima dele, pode-se calcular a Distância Euclidiana entre o Vetor y e cada linha da Matriz X (Base X), da seguinte maneira: d = sqrt(sum(abs(X – repmat(y, p, 1).^2,2)). Exercício
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
34
O arquivo dados_X.dat contém os dados de todos os vetores de características no formato de um vetor coluna de 60 elementos. Montar a Matriz (X) de vetores de características (Base X) no formato (10 x 6) (10 vetores x 6 características). load dados_X.dat nx = numel(dados_X)/6; X1 = reshape(dados_X,6,nx); X = X1.'; Usando a função dada, calcular a Distância Euclidiana entre o Vetor de Características y1 = [09 43 37 49 41 39] e os padrões armazenados na base X. Fazer o mesmo para o Vetor de Características y2 = [53 17 38 04 47 37]. Aplicar o mesmo cálculo para o padrão y3 = [25 05 19 57 20 38]. Verificar, em cada caso, se o padrão pode ser dito como pertencente à Base X ou não.
Descrever, utilizando o Help do MatLab, a operação completa realizada pelo cálculo realizado no exercício anterior. Outro conjunto de 10 Vetores de Características formam a Base Y (10 x 6) que está armazenada no arquivo dados_Y.dat como um Vetor Coluna de (1 x 60). Y=[14 21 26 29 36 48; ... 19 24 43 34 39 05; ... 58 48 52 47 12 06; ... 32 09 04 52 29 03; ... 29 35 19 57 42 55; ... 01 07 56 11 37 38; ... 20 22 11 19 48 42; ... 14 24 60 08 18 48; ... 10 57 28 03 05 21; ... 13 59 37 56 03 47];
Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
35
Exercício Carregar os arquivos referentes a cada uma das bases e gerar as Bases X e Y de população de Vetores de Características no formato (10 x 6). load dados_X.dat nx = numel(dados_X)/6; X1 = reshape(dados_X,nx,6); X = X1.'; load dados_Y.dat ny = numel(dados_Y)/6; Y1 = reshape(dados_Y,ny,6); Y = Y1.'; Para calcular a Distância Euclidiana entre as duas populações de Vetores (X de dimensão p x n) e (Y de dimensão q x n) pode-se utilizar a função proposta em (Gonzalez;Woods:Eddins,2004) com a seguinte sintaxe: D = sqrt(sum(abs(repmat(permute(X, [1 3 2]),[1 q 1]) - repmat(permute(Y, [3 1 2]),[p 1 1])).^2,3)); Onde D(i,j) é a Distância Euclidiana entre a i-ésima e a j-ésima linhas da população de vetores, ou seja, a Distância Euclidiana entre X(i,:) e Y(j,:). Exemplo: Considerando a população de Vetores de Características a formada pela Base X, calcular a Matriz de Distâncias Euclidianas entre cada Vetor e outro da Base. A Matriz de Distâncias Euclidiana terá a diagonal formada por zeros equivalendo a distância entre o Vetor e ele mesmo. A função do MatLab que realiza esta operação tem a seguinte sintaxe: DE = pdist(X,'euclidean'); Que calcula a Distância Euclidiana entre cada linha da Matriz X e as outras, colocando o resultado em um Vetor de dimensão (1 x (n/2.(n-1)). Para gerar uma Matriz de Distâncias Euclidianas deve-se utilizar a função: Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]
36
MDE = squareform(DE); Que monta a Matriz de Distâncias, matriz quadrada onde o MDE(i,j) significa a Distância Euclidiana entre o Vetor i e o Vetor j da Base X.
A Distância de Mahalanobis entre dois vetores n-dimensionais x e y é definida como o escalar: d m ( x, y ) = ( y − x ) C x ( y − x ) T
Onde
C x
1
−
é a Matriz de Covariância da população de Vetores da Base X.
A função do MatLab que realiza esta operação tem a seguinte sintaxe: DM = pdist(X,’mahalanobis’); Que calcula a Distância de Mahalanobis entre cada linha da Matriz X e as outras, colocando o resultado em um Vetor de dimensão (1 x (n/2.(n-1)). Para gerar uma Matriz de Distâncias de Mahalanobis deve-se utilizar a função: MDM = squareform(DM); Que monta a Matriz de Distâncias, matriz quadrada onde o MDM(i,j) significa a Distância de Mahalanobis entre o Vetor i e o Vetor j da Base X. A Distância de Mahalanobis calculada entre os Vetores da base Y e o centróide que representa os vetores da Base X (média de X ou protótipo de X) pode ser calculada como: d m ( x, m x ) = ( y − m x ) T C x 1 ( y − m x ) −
Onde
m x
é ao centroide da população de vetores da Base X.
A função do MatLab que realiza esta operação tem a seguinte sintaxe: DM = mahal(Y,X) 15 ANÁLISE DE AGRUPAMENTOS (CLUSTER ANALYSIS) No MatLab a função Z = linkage(Y,'method') computa uma árvore de agrupamento hierárquico usando o algoritmo especificado na variável 'method'. O ‘method’ pode ser: 'single'
Ligação Simples (default) Prof. M.Sc. Nielsen Castelo Damasceno – www. ncdd.com.br – E-mail:
[email protected]