Upload
gian-foeger
View
90
Download
5
Embed Size (px)
Citation preview
1
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
INTRODUÇÃO A VISÃO COMPUTACIONAL USANDO MATLAB
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 de Inten sidades
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 double. A Matriz I 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 os valores de amin e amax como o mínimo e máximo dos valores da Matriz A.
2
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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
9 9 9 9
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.
3
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 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 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 Indexada.
Sintaxe:
[X,map] = gray2ind(I,n)
Descrição:
gray2ind coloca em escala e arredonda uma Imagem de Intensidades I
produzindo uma Imagem Indexada equivalente.
[X,map] = gray2ind(I,n)
4
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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)
5
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 d e 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.
6
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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
7
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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)
8
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
9
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
10
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
11
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 meios-
tons.
12
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
13
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
14
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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)
15
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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:
)],([),( yxfTyxg =
onde ),( yxf é 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 I ntensidades -
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:
),( nlevfhisteqg =
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);
16
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 com ando.
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)
17
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 AL TA
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, 7x 7, 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 (fa zer 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:
18
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 p assa 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 orig inal da ferramentas.bmp,
contaminá-la com ruído ‘salt & pepper’ com 60% de p robabilidade 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);
19
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 componente s.
g = cat(3, fR, fG, fB);
subplot(2,3,1);imshow(fR)
subplot(2,3,2);imshow(fG)
subplot(2,3,3);imshow(fB)
20
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 separadament e 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))
21
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.
22
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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
1
1
0
1010
B
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 ele mento 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)
23
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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
1
1
1
8
1
1
1
1
w
24
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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.ti f'.
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)
25
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 o bter 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 detector es de Roberts e de
Prewitt. Comparar os resultados com o Detector de S obel.
O detector de bordas LoG (Laplaciano da Gaussiana) tem a seguinte sintaxe
usando a função edge:
[ g, t ] = edge(f, ‘log’, T, sigma),
26
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 g eradas 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),
27
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 realiza da 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
28
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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
29
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
Implementar o Algoritmo de Threshold Automático (Go nzalez;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
30
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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-DIMEN SIONAIS
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} =
31
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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élu las 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 ESTRUT URAS BI-
DIMENSIONAIS)
32
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 com o 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élu las 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:
( ) ( )[ ] 2/12211),( nne yxyxxyyxyxd −++−=−=−= L
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
33
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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 V etor de Características
x = [53 23 43 55 02 13] padrão este armazenado. Cal cular 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 )( pxnX , 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 1 0 Vetores de
Características (Padrões) referentes a 10 imagens d e 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
34
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
O arquivo dados_X.dat contém os dados de todos os v etores de
características no formato de um vetor coluna de 60 elementos. Montar a
Matriz (X) de vetores de características (Base X) n o 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 Euclidia na 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 perten cente à 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];
35
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
Exercício
Carregar os arquivos referentes a cada uma das base s e gerar as Bases X e Y
de população de Vetores de Características no forma to (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 Car acterí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 Euclidi ana terá a diagonal formada
por zeros equivalendo a distância entre o Vetor e e le mesmo. A função do
MatLab que realiza esta operação tem a seguinte sin taxe:
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:
36
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
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:
( ) ( )xyCxyyxd xT
m −−= −1),(
Onde xC é 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:
)()(),( 1xx
Txxm myCmymxd −−= −
Onde xm é 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)
37
Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: [email protected]
'complete' Ligação Completa
'average' Ligação Média
'weighted' Ligação Média Ponderada
'centroid' Ligação Centróide (Y deve conter Distâncias Euclidianas)
'median' Ligação Centro de Massa Ponderado
'ward' Ligação Distância Quadrada Interna (algoritmo de mínima variância)
Outra função do MatLab, H = dendrogram(Z) plota um dendrograma do
cluster hierárquico representado por Z, onde Z é uma matriz (m-1) x 3 , gerada
através de uma Função de Ligação e m é o número de objetos no conjunto de
dados original. A saída H, é um vetor que produz as linhas do dendrograma.
Procedimento Básico para a Análise Hierárquica através do MatLab:
1) Encontrar a similaridade ou dissimilaridade entre cada par de objetos no conjunto
de dados. (função pdist)
2) Agrupar os objetos em uma Árvore Hierárquica de Grupos . (função linkage)
3) Determinar onde dividir a Árvore Hierárquica em grupos. (função cluster)