87092131 introducao visao computacional matlab

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

Upload: gian-foeger

Post on 18-Feb-2015

90 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: 87092131 Introducao Visao Computacional Matlab

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.

Page 2: 87092131 Introducao Visao Computacional Matlab

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.

Page 3: 87092131 Introducao Visao Computacional Matlab

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)

Page 4: 87092131 Introducao Visao Computacional Matlab

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)

Page 5: 87092131 Introducao Visao Computacional Matlab

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.

Page 6: 87092131 Introducao Visao Computacional Matlab

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

Page 7: 87092131 Introducao Visao Computacional Matlab

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)

Page 8: 87092131 Introducao Visao Computacional Matlab

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.

Page 9: 87092131 Introducao Visao Computacional Matlab

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.

Page 10: 87092131 Introducao Visao Computacional Matlab

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.

Page 11: 87092131 Introducao Visao Computacional Matlab

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.

Page 12: 87092131 Introducao Visao Computacional Matlab

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.

Page 13: 87092131 Introducao Visao Computacional Matlab

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.

Page 14: 87092131 Introducao Visao Computacional Matlab

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)

Page 15: 87092131 Introducao Visao Computacional Matlab

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

Page 16: 87092131 Introducao Visao Computacional Matlab

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)

Page 17: 87092131 Introducao Visao Computacional Matlab

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:

Page 18: 87092131 Introducao Visao Computacional Matlab

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

Page 19: 87092131 Introducao Visao Computacional Matlab

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)

Page 20: 87092131 Introducao Visao Computacional Matlab

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

Page 21: 87092131 Introducao Visao Computacional Matlab

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.

Page 22: 87092131 Introducao Visao Computacional Matlab

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)

Page 23: 87092131 Introducao Visao Computacional Matlab

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

Page 24: 87092131 Introducao Visao Computacional Matlab

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)

Page 25: 87092131 Introducao Visao Computacional Matlab

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

Page 26: 87092131 Introducao Visao Computacional Matlab

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

Page 27: 87092131 Introducao Visao Computacional Matlab

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

Page 28: 87092131 Introducao Visao Computacional Matlab

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

Page 29: 87092131 Introducao Visao Computacional Matlab

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

Page 30: 87092131 Introducao Visao Computacional Matlab

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

Page 31: 87092131 Introducao Visao Computacional Matlab

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)

Page 32: 87092131 Introducao Visao Computacional Matlab

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

Page 33: 87092131 Introducao Visao Computacional Matlab

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

Page 34: 87092131 Introducao Visao Computacional Matlab

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

Page 35: 87092131 Introducao Visao Computacional Matlab

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:

Page 36: 87092131 Introducao Visao Computacional Matlab

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)

Page 37: 87092131 Introducao Visao Computacional Matlab

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)