Você está na página 1de 37

1

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 normalizadas no intervalo [0,1].

cada cor

R,

G

e

B,

1.1 Convertendo uma Matriz para uma Imagem 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 double.

A Matriz I conterá valores entre 0 (preto) e 1 (branco).

Os Parâmetros amin e corresponderão a 0 e 1 na

Imagem I.

amax

são

os

valores

na

Matriz

A

que

I = mat2gray(A) Estabelece os valores 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: nielsen.tekla@gmail.com

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

20 30

5 6

7

3

2

4

8]

4

4

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.

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

3

imshow(I,[low high]) Mostra a Imagem I em nível de cinza, especificando os

qualquer valor

menor do que ele) corresponde ao preto; o parâmetro high (e qualquer valor

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

maior do que ele) é

limites dos valores

de

branco

e preto.

O parâmetro

low

(e

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

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

Mostrar a imagem

dada

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)

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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.

é: 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.

Uma sintaxe da função imwrite, aplicável somente a imagens JPEG,

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.

função

a)

b)

Salvar a imagem bubbles.jpg com o nome de bubbles5.jpg , com q=5.

Ler a imagem bubbles5.jpg e gerar a informação sobre ela através da

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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:

têm mais ou menos a mesma representação da figura 1: Figura 1 – Histograma de uma

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: nielsen.tekla@gmail.com

9

9 Figura 2 – Informações sobre os tons da imagem. A figura 2 é um exemplo

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: nielsen.tekla@gmail.com

10

10 Figura 3 – Histograma com condições de luz normal. 2.2 Imagens com 'low key' e

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.

key' (chaves altas) têm a maioria dos tons nos brilhos. Figura 4 – Imagem Low key.

Figura 4 – Imagem Low key.

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

11

11 Figura 5 – Imagem High key. Antes de tirar uma foto, é útil determinar se

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.

média de contagem de pixels é trazida para os meios-tons. Figura 6 – Imagem com média

Figura 6 – Imagem com média de contagem de pixel tendendo para meios- tons.

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

12

12 Figura 7 – Imagem High key trazida para meios-tons A maioria das câmeras digitais são

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'.

luz é dita estar 'estourada' ou 'cortada'. Figura 8 – Figura com alta-luz cortada. O histograma

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: nielsen.tekla@gmail.com

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.

sol forte, por outro lado, terão contraste muito mais alto. Figura 9 – Imagens com 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: nielsen.tekla@gmail.com

14

14 Figura 10 – Imagens com diferentes contrastes. A região no topo da figura 10 contém

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: nielsen.tekla@gmail.com

15

3 TRANSFORMAÇÃO DE INTENSIDADES

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:

As técnicas de processamento no

domínio

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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.

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:

O Toolbox

de

Processamento

de

Imagens

do

MATLAB

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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.

Converter

a

imagem

Exercício

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

22

11

Binárias)

11.1 Dilatação e Erosão

MORFOLOGIA

MATEMÁTICA

(Operações

Morfológicas

em

Imagens

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

estruturante:

a

imagem

broken_text.tif

B =

0

0

1

1

1

1

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)

usando

0

0

1

o

seguinte

elemento

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: nielsen.tekla@gmail.com

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:

w =

1

1

1

1

8

1

1

1

1

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

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:

através da convolução da imagem com templates do tipo: Exercício Detectar linhas em –45º da Imagem

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

28

length - Distância entre o point1 e o point2

theta

rho

- Ângulo em graus da célula da HT - Posição de rho na célula da HT

- Ângulo em graus da célula da HT - 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)

o nível de limiar

calculado entre [0, 1].

Onde

I

é

a imagem de classe uint8, uint16, ou double e T

é

Exercicio

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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 BI- DIMENSIONAIS)

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

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

x

,

y

) =

x

x , y ) = x y = y

y

=

y

(

e

x

=

[(

x

1

y

1

)

2

+

L +

(

x

n

y

n

)

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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: nielsen.tekla@gmail.com

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)

T

C

x

1

(y x)

Onde

C

x

é

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:

Onde

m

x

é

d

m

(

x m

,

x

)

=

(

y

m

x

)

T

C

x

1

(

y

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'.

'single'

O ‘method’ pode ser:

Ligação Simples (default)

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com

37

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

= 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.

Outra função

do

MatLab, H

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)

Prof. M.Sc. Nielsen Castelo Damasceno – www.ncdd.com.br – E-mail: nielsen.tekla@gmail.com