Você está na página 1de 124

“Visão Computacional e Reconhecimento de

Imagens em Sistemas Embarcados”

Nome Original da disciplina:


“Organização de Processadores Embarcados”

Prof. Msc. Francisco Fambrini


16/3/2019
AULA 1 – versão 2
Data das aulas
• 09/05 (Manhã) - 1 Aula (HOJE)
• 09/05 (Tarde) - 2 Aula (HOJE)
• 23/05 (Manhã) - 3 Aula
• 23/05 (Tarde) - 4 Aula
• 06/06 (Manhã) - 5 Aula
• 06/06 (Tarde) - 6 Aula (ENCERRAMENTO)
WhatsApp (11) 9 - 9517 4512 (texto)
fambrini@unicamp.br
Ementa original
– Duração: 24horas/aula (6 sábados)

Ementa:
• Estrutura básica dos computadores
• Arquitetura e conjunto de instruções
• BIOS - Basic Input/Output
• Software
• Basic Processing Unit
• Pipelining
• Organização de entrada e saída
• Sistema de memória
• Unidade Lógica Aritmética (ULA)
• Sistemas embarcados
• Sistemas em um único chip
• Processamento e desempenho paralelos
• Interfaces
Bibliografia Básica (Ementa original):

• David A. Patterson. John L. Hennessy .Computer Organizationand


Design, FifthEdition: The Hardware/Software Interface. Morgan
Kaufmann; 5 edition ,October 10, 2013.

• Carl Hamacher. Computer OrganizationandEmbedded Systems6th


Edition. McGraw-Hill Education; 6 editionJanuary 27, 2011.

• Kamal ,Raj. Embedded Systems ArchitectureProgrammingAnd


Design, 2nd Ed, Pearson Education, 2005.

Bibliografia Complementar (Ementa original):

• 1. Hardware/Firmware Interface Design: Best Practices for


Improving Embedded Systems Development by Gary Stringham,
376pp, 2010, ISBN 9781856176057. Published by Newnes.
Proposta
• Como o conteúdo da ementa original já foi abordado em
outras disciplinas, em comum acordo com o Coordenador
(prof. Nivaldo Marcusso) e com os alunos desta disciplina,
propomos a mudança da ementa e do título desta disciplina
para:

“Visão Computacional e
Reconhecimento de Imagens
em Sistemas Embarcados”
Nova Ementa proposta
- Representação
O que é uma imagem, Layout de uma imagem, cor da imagem, resolução e quantização, tipos de dados
na imagem, compressão, RGB, conversão de imagens RGB em escalas de cinza, acesso a valores de pixel.

- Formação
Sistemas de captura de imagens, a câmera, Processos de Digitalização, resolução versus desempenho,
ruído

- Pixels
Imagens binárias, imagens em escalas de cinza, histogramas, equalização de histogramas, operações
com imagens em cores

- Realce
Realce por meio de filtragem, filtragem pela média, pela mediana, por ordem e filtragem por Gaussiana
Filtragem para detecção de bordas
Detecção de bordas com operador laplaciano, laplaciano de Gaussiana, detetor de passagem por zero.

- Transformadas de Fourier e processamento no domínio da frequência


Aplicações de Fourier em imagens e Teorema da Convolução.
- Restauração de imagens
Filtros de Deconvolução, filtro de Wiener-Helstrom

- Geometria
Deformações e transformações na imagem

- Processamento morfológico
Imagens binárias, Dilatação, Erosão e Elementos Estruturais

- Características
Descritores de Forma de um Parâmetro e Análise de Componentes Principais

- Segmentação de imagens
Funções de Segmentação, Filtros Laplaciano de gaussiana, detetores de Canny,
WaterShelds

- Classificação
Classificação Supervisionada e não-supervisionada, classificadores simples, Knn,
Classificador Bayesiano, k-médias.
• A biblioteca OpenCV
• A versão otimizada do OpenCV para sistemas
embarcados: SimpleCV
• Aplicações em SimpleCV para Raspberry PI

Obs: Este curso está baseado na Placa Raspberry Pi modelo 2, porque


o professor possui mais experiência com esta plataforma.
Porém, SimpleCv roda em Linux (na maioria das distribuições) e nada
impede que os alunos adaptem para outras plataformas de Linux
Embarcado de sua preferência, como por exemplo, Beagle Bone
Board.
Algumas referências na Internet:

[1] http://simplecv.org/

[2] http://www.embarcados.com.br/opencv-2-4-
9-qt5-ubuntu/

[3] http://www.simplecv.org/download

[4] https://github.com/sightmachine/simplecv
Bibliografia recomendada
• Livros sobre teoria geral de Processamento de Imagens
Na Biblioteca Virtual temos:
Livro sobre SimpleCV e Raspberry PI

Raspberry Pi Computer Vision Programming


Paperback – May 28, 2015
Ashwin Pajankar (Author)
Livros sobre Process. Imagens em Raspberry PI
Em particular, é muito interessante o Livro:

“Practical Computer Vision with SimpleCV “

Autor: Cuauhtemoc Carbajal (2012)


Um excelente programa para processar
imagens, já pronto

• É o ImageJ, que pode ser baixado


grtuitamente no seguinte link:

https://imagej.nih.gov/ij/
Site importante de consulta
https://www.bogotobogo.com/Matlab/Matlab_Tutorial_Digital_Image_Proce
ssing_I.php
Processamento de Imagens - Etapas
O processamento digital de imagens é composto pelas etapas ilustradas no diagrama
de blocos da Figura 1.
A captura da imagem consiste no uso de dispositivos físicos sensíveis a espectros de
energia eletromagnética que convertem o sinal elétrico para um formato digital. O
pré-processamento consiste no realce da imagem para enfatizar características de
interesse ou recuperar imagens que sofreram alguma degradação devido à
introdução de ruído, perda de contraste ou borramento. A segmentação é a
extração ou identificação dos objetos contidos na imagem, separando a imagem
em regiões. Por fim, a classificação, é o processo que identifica a imagem
observada (GONZALES, 2000).
O que é uma imagem digital ?
• Uma imagem digital é a representação de uma imagem bidimensional
usando números binários codificados de modo a permitir seu
armazenamento, transferência, impressão ou reprodução, e seu
processamento por meios eletrônicos.
• Há dois tipos fundamentais de imagem digital:do tipo rastreio(raster) e
outra do tipo vetorial.
• Uma imagem digital do tipo raster, ou bitmap, ou ainda matricial, é aquela
que em algum momento apresenta uma correspondência bit-a-bit entre
os pontos da imagem raster e os pontos da imagem reproduzida na tela de
um monitor. A imagem vetorial não é reproduzida necessariamente por
aproximação de pontos, antes era destinada a ser reproduzida
por plotters de traçagem que reproduziam a imagem por deslocamento de
canetas-tinteiro.
• Tipicamente, as imagens raster são imagens fotográficas, e as imagens
vetoriais são desenhos técnicos de engenharia. Os quadrinhos ilustrados
se assemelham em qualidade a imagens raster, mas são impressos
em plotters que passaram a imprimir à maneira das impressoras comuns
por jato de tinta.
Em outras palavras...
• Imagem é uma matriz de números. Pode ser
uma matriz bidimensional nXm (no caso de
imagens monocromáticas ou em Escala de
Cinza) ou então uma Matriz tridimensional
n X m X cor no caso de uma imagem em
cores RGB.
O que precisamos para processar
imagens ?
• Precisamos de uma Linguagem de Programação que trabalhe
com facilidade com matrizes.
C ou C++ dificulta o trabalho, porque não consegue operar
com matrizes sem usar bibliotecas para isso.
Linguagens que facilitam o trabalho:

a) MATLAB (possui extensa biblioteca para Visão


Computacional: toolbox/images/images );
b) Python (com as bibliotecas NumPy - http://www.numpy.org/
e SimpleCV - http://www.simplecv.org/ );
c) JAVA (com a biblioteca OpenCV – http://opencv.org/ ).
Imagem tipo Raster
• A imagem de rastreio, ou raster, é a representação em duas
dimensões de uma imagem como um conjunto finito de
pontos definidos por valores numéricos, formando
uma matriz matemática ou malha de pontos, onde cada
ponto é um pixel.
• Tipicamente, cada ponto de uma imagem é decomposto
em uma tripla de cores e cada proporção relativa é
transformada em valores numéricos que permitem que
eles sejam recuperados. No modelo conhecido como RGB,
por exemplo, a imagem é decomposta nas cores vermelho,
verde e azul, estabelecendo para cada uma dessas cores
um valor entre o máximo possível de reprodução daquela
cor e o mínimo, ou seja, a ausência total dela. A soma dos
três valores resulta num ponto colorido da imagem final.
Imagem Vetorial
• A imagem vetorial é criada recorrendo a entidades de desenho
como retas, pontos, curvas polígonos simples, etc.

• A imagem vetorial era originalmente dependente de equipamentos


de desenho controlados numericamente como um plotter de
traçagem e, sendo dependente de interpretação pelo dispositivo, a
imagem de uma entidade como a linha necessita de poucas
informações para ser representada, como o tipo de linha, a sua cor,
sua espessura, o ponto de início, o ponto final.
• Plotters de traçagem encontram-se em desuso, obsoletizados por
plotters de rastreamento que imprimem desenhos à maneira das
impressoras, fazendo primeiro uma conversão de um desenho
vetorial para um desenho de rastreio. O tamanho dos arquivos de
desenho vetorial são relativamente menores que os arquivos de
desenho de rastreio.
Formatos de Imagens
• A maioria dos formatos de imagens digitais são precedidos por um
cabeçalho que contém atributos (dimensões da imagem, tipo de
codificação, etc.), seguido dos dados da imagem em si.
• Um arquivo de imagem JPEG que é originada por câmeras
fotográficas digitais não é um arquivo de imagem na acepção da
palavra. A imagem contida no JPEG sofre compressão com perda de
dados, ou seja, a imagem original não é recuperável em 100%, o
que não ocorre com uma imagem bit-mapeada.
• O arquivo JPEG acrescenta dados numa região de metadados com
informações sobre a data e hora da tomada da foto e, dependendo
da câmera, até mesmo sobre o local por onde foi obtida a
fotografia. Acrescenta ainda as características físicas da fotografia
(sensibilidade ISO, velocidade de obturação, abertura do diafragma,
etc) e, mais, contém uma miniatura da imagem para efeito de
visualização e catalogação das fotos armazenadas na própria
câmera fotográfica.
Formatos mais importantes de Imagens
JPEG - Joint Photographic Experts Group
A extensão em DOS é "JPG". É o formato mais utilizado e conhecido atualmente. Quase todas as câmaras dão
esta opção para guardar as imagens. Arquivo muito utilizado na Internet e em multimidia, por ter uma
compactação excelente, algo fundamental ao meio, e por suportar até 16.777.216 cores distintas.
TIFF - Tagged Image File Format
Arquivo padrão para impressão industrial (offset, rotogravura, flexogravura); também muito usado como opção
nas câmaras fotográficas.
É um formato de arquivos que praticamente todos os programas de imagem aceitam. Foi desenvolvido em
1986 pela Aldus e pela Microsoft numa tentativa de criar um padrão para imagens geradas por
equipamentos digitais.
O TIFF é capaz de armazenar imagens true color (24 ou 32 bits). É um formato muito popular para transporte
de imagens do desktop para bureaus, para saídas de scanners e separação de cores.
O TIFF permite que imagens sejam comprimidas usando o método LZW e permite salvar campos informativos
(caption) dentro do arquivo. No Photoshop, use o comando File Info do menu File para preencher tais
campos informativos.
GIF - Graphics Interchange Format
Criado para ser usado extensivamente na Internet. Suporta imagens animadas e 256 cores por frame. Foi
substituído pelo PNG.
BMP - Windows Bitmap
Normalmente usado pelos programas do Microsoft Windows. Não utiliza nenhum algoritmo de compressão,
daí esse formato apresentar as fotos com maior tamanho.
SVG - Scalable Vector Graphics
É um formato vetorial, criado e desenvolvido pelo World Wide Web Consortium.

PNG - Portable Network Graphics


É um formato livre de dados utilizado para imagens, que surgiu em 1996 como substituto para o
formato GIF, devido ao fato de este último incluir algoritmos patenteados. Suporta canal alfa, não
tem limitação da profundidade de cores, alta compressão (regulável). Permite comprimir as
imagens sem perda de qualidade, ao contrário de outros formatos, como o JPG.

PCD - Kodak Photo CD


Este é um formato proprietário lançado pela Kodak, em 1992 como parte um sistema de digitalização e
armazenamento de imagens para suprir a demanda no início da popularização das imagens digitais.
Dessa forma, um rolo de filme era capturado por um scanner em imagens com 36 bits (12 bits por
cor) e transformado em arquivos digitais por uma estação de tratamento chamada Photo Imaging
Workstation (PIW). As imagens então são gravadas em um CD usando uma estrutura especial (livro
bege), porém compatível com os leitores comuns de CD. O produto não alcançou massa suficiente
para se estabelecer no mercado e foi descontinuado pela Kodak. O formato, porém ainda é lido e
aceito pelos principais programas de edição de imagens.

DWG - AutoCAD drawing


Arquivos de texto no padrão ASCII utilizados para armazenar dados de programas CAD.

RAW - Família de formatos de arquivo RAW


RAW refere-se à família de formatos de imagem RAW que são originados pela maioria das câmeras
digitais profissionais. O formato RAW não é padronizado nem documentado, e difere de fabricante
para fabricante. Trata-se de um formato proprietário de cada fabricante.
Tipos de Dados nas Imagens

1) Imagens Binárias (preto e branco) ou 0 e 1


2) Imagens em escala de cinza ( de 0 até 255)-8
bits (grayscale).
3) Imagens RGB ou de cores reais (são matrizes
3 x (R,G,B) ). Normalmente 24 bits ( 3 x 8).
4) Imagens em ponto flutuante (por exemplo,
imagens no domínio da frequência de
Fourier).
Tipos de dados nas imagens
• 1) Imagens binárias: São matrizes bidimensionais que alocam um conjunto de bits (0 ou 1)
para cada pixel da imagem. São imagens lógicas: o preto corresponde a zero e o branco
corresponde a 1. Uma imagem de fax (ou fac-simile) é um exemplo de imagem binária.
Também chamada de imagem Monocromática. Exemplos:
Imagem .bmp (RGB) convertida para imagem binária, baseado em
threshold

Obs: Muitas vezes, a imagem binária já tem informações suficientes para fazer o
Reconhecimento das características desejadas no projeto. Um exemplo disso,
são os sistemas OCR, que reconhecem as chapas dos carros.
Outro exemplo
im = imread('lena.bmp');
bw = im2bw(im, 0.4);
imshow(bw);
Conversão de imagem RGB para binário usando o
MATLAB

X= imread('arvores.bmp');

% O parâmetro após o X ajusta o nível de threshold


% nivel de binarização
BW = im2bw( X, 0.5);

% mostra as 2 figuras na tela


imshow(X), figure, imshow(BW)
Imagem binarizada com diversos níveis de threshold

Imagem JPG original


Imagem binária com threshold=0.25
Imagem binária com threshold=0.5
Imagem binária com threshold=0.75
2) Imagens em Escala de Cinza (Intensidade)
• São matrizes 2D que alocam um valor numérico
(normalmente entre 0 e 255, isto é, 8 bits) a cada
pixel que representa a intensidade em um ponto.
Imagem em cores RGB convertida para escala de
cinza
Mecanismo de Conversão
Usa a seguinte equação, que faz uma média
ponderada da intensidade de cada componente
(R=vermelho, G=verde, B=azul) para calcular o
valor da intensidade de cinza (também chamada
Luminância Y ) do Pixel:

Y = 0.2989 * R + 0.5870 * G + 0.1140 * B

Onde Y é o nível de cinza de cada pixel na imagem


final.
Convertendo imagem RGB para escalas de
cinza no MATLAB

RGB = imread('Stonehenge.jpg');
imshow(RGB)
I = rgb2gray(RGB);
figure
imshow(I)
Atividade 1
1) Transforme a imagem abaixo em escala de cinzas:

2) Obtenha o Histograma da imagem em escala de cinzas que você obteve acima

3) Transforme a mesma imagem em Preto e Branco (imagem binária) utilizando o


O algoritmo de Otsu para os seguinte limiares: (a) 0,25 (b) 0,50 e (c) 0,75

4) Encontre uma imagem RGB (em cores) na internet a sua escolha, e repita para ela os
passos (1), (2) e (3)

Entregue os resultados no email fambrini@unicamp.br , enviar em PDF


O email deve ter como titulo seu_nome_Ativ1
Convertendo imagem RGB para escalas de cinza no MATLAB
Histograma para as Imagens em Escala de
Cinza
Uma das ferramentas mais importantes para analisar imagens em Escala de
Cinza é o Histograma de Contraste.

Em processamento de imagens, trabalha-se sempre com os tons de cinza


(digital numbers ou DNs) atribuídos aos pixels de uma imagem.
O histograma é uma das formas mais comuns de se representar a distribuição
dos DNs de uma imagem, e possivelmente a mais útil em processamento
digital de imagens. Ele fornece a informação sobre quantos pixels na
imagem possuem cada valor possível de DN (que, no caso das imagens de 8
bits, variam de 0 a 255) ou, de forma equivalente, qual a proporção da
imagem que corresponde a cada valor de DN.
Os histogramas são também conhecidos como distribuição de
intensidades e Função de Densidade de Probabilidade (PDF). Esse último
termo advém do fato de que, estatisticamente, o histograma representa,
neste caso, a probabilidade de se achar um DN de um dado valor dentro de
uma imagem.
Histograma: somente para imagens em escala de cinza

Imagem “rice.png”

Histograma para a imagem “rice.png”


Calculo do Histograma usando o MATLAB
Calculo do Histograma usando o MATLAB

RGB = imread('Stonehenge.jpg');

imshow(RGB)

I = rgb2gray(RGB);

imshow(I)

% Mostra o Histograma da Imagem


figure;
imhist(I);
Também é possível obter o Histograma para uma imagem em cores (RGB),
sendo que são feitos 3 Histogramas em separado, um para cada canal de cor.
Para que serve o Histograma ?
• Um histograma de imagem típico é composto por até 256 colunas
dispostas lado-a-lado. Cada uma dessas colunas representa um nível de
luminosidade, desde o preto absoluto até o branco absoluto. Para criar o
gráfico, a câmera ou o programa classifica, de acordo com a luminosidade,
todos os pixels que compõem a imagem e os distribui ao longo das 256
colunas, criando uma espécie de curva. Na prática, o que nós vemos é o
contorno dessa curva, e não as colunas individuais.
• O histograma de uma imagem muito escura, portanto, terá colunas mais
altas na lateral esquerda do que na direita. Em fotos claras, é o lado direito
do gráfico que ficará mais cheio. Em ambos os casos, se os valores mais
extremos (preto ou branco absolutos) estiverem muito acima do resto do
gráfico, a foto muito provavelmente estará, respectivamente, subexposta
ou superexposta.
• Neste caso, detalhes devem ter sido irremediavelmente perdidos nas
sombras ou nas áreas claras – o que se costuma chamar
de shadow e highlight clipping. A principal utilidade do histograma é
justamente evitar essa perda de detalhes, mostrando ao fotógrafo que é
preciso corrigir alguma coisa na exposição para a distribuição de
luminosidade ficar mais centralizada no gráfico.
Para que serve o Histograma ?

O Histograma é a melhor ferramenta para se fazer o Realce de


Contraste de uma imagem.
• A técnica de realce de contraste tem por objetivo melhorar a
qualidade das imagens sob os critérios subjetivos do olho
humano. É normalmente utilizada como uma etapa de pré-
processamento para sistemas de reconhecimento de padrões.
• O contraste entre dois objetos pode ser definido como a razão
entre os seus níveis de cinza médios.
• A manipulação do contraste consiste numa transferência
radiométrica em cada "pixel", com o objetivo de aumentar a
discriminação visual entre os objetos presentes na imagem.
Realiza-se a operação ponto a ponto, independentemente da
vizinhança.
O que é Realce de Contraste ?
• A escolha do mapeamento direto adequado é, em geral,
essencialmente empírica. Entretanto, um exame prévio do histograma
da imagem pode ser útil. O histograma de uma imagem descreve a
distribuição estatística dos níveis de cinza em termos do número de
amostras ("pixels") com cada nível. A distribuição pode também ser
dada em termos da percentagem do número total de "pixels" na
imagem. Pode ser estabelecida uma analogia entre o histograma de
uma imagem e a função densidade de probabilidade, que é um
modelo matemático da distribuição de tons de cinza de uma classe de
imagens. A cada histograma está associado o contraste da imagem.
Por que aplicar Realce de Contraste?

• Para processar a imagem de modo que


possamos ver e avaliar a informação visual
nela contida com maior clareza.

• O Histograma também serve para a seleção


de limiares dentro de uma imagem.
Transformação Radiométrica
• Pode-se fazer um realce de contraste utilizando-se uma função matemática
denominada transformação radiométrica. Esta função consiste em mapear as
variações dentro do intervalo original de tons de cinza, para um outro intervalo
desejado e é utilizado para aumentar o contraste de uma imagem, expandindo o
intervalo original de níveis de cinza da imagem original.
Histograma para a Seleção de Limiares
Podemos usar o histograma da imagem para o cálculo de uma valor automático de
limiar. No exemplo a seguir, a função graythresh (do MATLAB) explora o Método
matemático de Otsu, que escolhe o valo de limiar que minimiza a variância
estatística interclasse dos pixels preto e branco resultantes da aplicação de limiar.

Imagem ‘coins.png’
Resultado da Aplicação do Limiar de
Otsu no Histograma de ‘coins.png’
Seleção de Limiar através do Método de Otsu usando
MATLAB

I=imread ('coins.png'); % Lê a imagem das moedas

level = graythresh(I); % obtém o Limiar de Otsu


It= im2bw(I,level); % Aplica o Limiar na Imagem
figure
imshow(I);
figure
imshow(It); % Exibe a imagem resultante,
% com EQUALIZAÇÃO DO HISTOGRAMA
Alongamento de Contraste
O Histograma também pode ser usado para fazer Alongamento de Contraste (contrast
stretching ) também conhecido como normalização, uma operação que alonga a
faixa de intensidade de pixels de entrada para que a imagem de saída tenha faixa
dinâmica mais larga.

I = imread ('pout.tif'); % Lê a imagem


Ics = imadjust (I, stretchlim(I,[0.05 0.95]),[]); % alonga o contraste
subplot(1,2,1), imshow(I); % Exibe a imagem original
subplot(1,2,2), imshow(Ics); % Exibe a imagem com contraste alongado
Histograma da imagem original

Imagem original ‘pout.tif’


Histograma da imagem Normalizada

Imagem com o Contraste Alongado através da Normalização do Histograma


Ambas as imagens, lado a lado
Para mostrar os Histogramas das duas imagens no
MATLAB

I = imread ('pout.tif'); % Lê a imagem


Ics = imadjust (I, stretchlim(I,[0.05 0.95]),[]); % Alonga o Contraste
figure % Mostra os 2 Histrogramas em figuras separadas
imhist(I);
figure
imhist(Ics);

Neste exemplo, usamos a função stretchlim( ) para identificar o 5º e o 95º


pontos percentis da distribuição do histograma. A função imadjust( ) é
então usada para mapear este intervalo ao máximo intervalo (default) de
quantização da imagem.
Equalização de Histograma
Experimente o código a seguir:

I =imread (‘pout.tif’);
Ieq = histeq(I);
Subplot(2,2,1), imshow(I);
Subplot(2,2,2), imshow(Ieq);
Subplot(2,2,3), imhist(I);
Subplot(2,2,4), imhist(Ieq);
Equalização do Histograma
Equalização Adaptativa do Histograma
Este método também está disponível no MATLAB e no OpenCV.
A obtenção de uma imagem com as desejadas características de contraste é uma arte que exige
a variação destes parâmetros baseado na experiência
Experimente o código MATLAB a seguir com imagens da sua preferência.
Veja o resultado no próximo slide.

I = imread ('pout.tif');

I1 = adapthisteq(I, 'clipLimit',0.02,'Distribution','rayleigh');
I2 = adapthisteq(I, 'clipLimit',0.02,'Distribution','exponential');
I3 = adapthisteq(I, 'clipLimit',0.08,'Distribution','uniform');

subplot(2,2,1),imshow(I); subplot(2,2,2),imshow(I2);
subplot(2,2,3),imshow(I2); subplot(2,2,4),imshow(I3);
(1)

Imagem original em (1) e três níveis de Equalização Adaptativa do Histograma.


Imagens RGB ou de cores reais
• O padrão mais simples de usar é o .bmp

Espaço de cores RGB


• As cores das matrizes representam a intensidade das cores
vermelho, verde e azul em cada imagem. Assim, as regiões
mais escuras em R, G e B são as que apresentam os pixels com
os menores valores para as componentes vermelho, verde e
azul, respectivamente. Nota-se que as regiões da imagem com
a cor mais próxima ao branco apresentam valores altos nas
três matrizes.

As 3 matrizes que formam uma imagem no espaço de cores RGB


Espaço de Cores YCbCr
• O espaço de cores YCbCr não é intuitivo como o
RGB mas é útil em aplicações de compressão de
imagem e transmissão de sinais de vídeo,
dividindo-se nas componentes de luminância e
crominância.
• A luminância (componente Y) mede a densidade
de intensidade da luz de um ponto na imagem, e
a crominância (componentes Cr e Cb) medem o
valor das cores.
• O espaço YCbCr pode ser representado pela
Figura do próximo slide, no qual os eixos x e y são
a crominância e, o eixo z é a luminância.
Gráfico do Espaço de cores YCbCr
• A Figura abaixo mostra as três componentes de cores
de uma imagem no espaço YCbCr. Ressalta-se que, a
componente Y é basicamente a imagem original em
escala de cinza.
Equação de Conversão de RGB para YCrCb

A seguinte equação matricial converte os valores RGB em


YCrCb ou YUV :
Separando os 3 canais de cores de uma imagem
com o MATLAB
Exemplo: Separando R, G, B em matrizes
unidimensionais
Exercício: Rode o programa abaixo no MATLAB e explique o resultado
gerado:

im = imread ('fambrini.bmp')
% Imagem em 24 bits
% im é uma matriz m x n x 3
R = im(:, :, 1); % Componente de vermelho
G = im(:, :, 2); % Componente de verde
B = im(:, :, 3); % Componente de azul

subplot(2,2,1 );imshow(R);
subplot(2,2,2 );imshow(G);
subplot(2,2,3 );imshow(B);
subplot(2,2,4 );imshow(im);
Decompondo a imagem e gerando novamente a partir de
suas 3 componentes
Decompor a imagem ‘fambrini.bmp’ em suas três componentes RGB.

f = imread(‘fambrini.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)
subplot(2,3,4);imshow(g)
Imagem indexada
Uma Imagem Indexada no MATLAB tem dois componentes:
a) Uma Matriz de Dados Inteiros (X), e
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

Exemplo:
Converter uma imagem RGB em uma imagem Indexada.

RGB = imread('peppers.png');
[X, map ] = rgb2ind(RGB, 256);
figure
imshow(X,map)
Alterar o número de cores de uma imagem
indexada
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.


RGB = imread('peppers.png');
[X,map] = rgb2ind(RGB,256);
[Y, newmap] = imapprox(X, map, 5); % Altera o numero de cores para apenas 5

subplot (2,2,1); imshow(X,map)


subplot (2,2,2); imshow(Y,map)
Gerar um mapa de cores da imagem
Para se especificar um mapa de cores pode-se usar a seguinte sintaxe:
map(k, : ) = [r(k) g(k) b(k)]

onde [r(k) g(k) b(k)] são os valores RGB que especificam uma linha de um mapa de
cor. O mapa deve ser completado variando-se k.
Para verificar as dimensões de uma imagem no
MATLAB
Conversão entre tipos de imagem
1-Converte a imagem RGB para uma imagem em
escala de cinzas:
RGB = imread('peppers.png');
I = rgb2gray(RGB);
figure
imshow(I)
figure
imshow(RGB)
Outro exemplo:
Converter imagem RGB em Escala de Cinza

D = imread('onion.png');
Dgray=rgb2gray(D);
subplot(2,1,1);imshow(D); axis image;
subplot(2,1,2);imshow(Dgray);
Imagem Indexada
Verificar o tipo da imagem
Matriz plotada como imagem
Escrever uma imagem para um arquivo
Operações Geométricas
Rotação
Adicionar ruído a uma imagem
Filtrar a imagem
Exemplo de uso do Filtro
Acesso a valores de pixel na imagem
B=imread('cell.tif');
imview(B);
B(25,50);
B(25,50)=255; % Especifica o valor do pixel em (25,50) como Branco
imshow(B);

-----------------------------------------------------------------------------------
Para imagens RGB em cores:

B=imread('onion.png');
imview(B);
B(25,50,1);

B(25,50,1)=255; % Coloca um pontinho vermelho na posição (25,50)


imshow(B);
EXERCÍCIOS
Atividade 3
a) Abra a imagem ‘lego.png’ (está na pasta Imagens do
professor) no MATLAB
b) Elabore um programa que conte automaticamente quantas
peças azuis de LEGO existem nesta imagem
Dica para começar o exercício...
I = imread('lego.png');
can_red =I(:,:,1); % Separar o canal vermelho
subplot(2,2,1); imshow(I)
subplot(2,2,2); imshow(can_red)
Solução – Parte 1
• O primeiro passo é verificar quais pixels tem menos vermelho (canal 1).
No caso foi usado o valor 90, mas você deve testar um valor que dê
melhores resultados com suas imagens.

Im = imread('lego.png');
imshow( Im);
azuis = Im(:,:,1) < 90;
imshow(azuis);
Solução – Parte 2
• Agora podemos identificar quais objetos há nessa foto.
Para isso usamos a função bwboundaries. Essa função identifica
os objetos presentes em uma imagem em preto e branco
(binária):
[B,L] = bwboundaries(azuis, 'noholes');
Solução – parte 3
• A função bwboundaries retorna duas variáveis: a primeira
representa os contornos dos objetos, a segunda é uma matriz de
índices em que cada elemento da matriz é um inteiro indicando de
qual objeto esse elemento da matriz faz parte.

• Se não ficou claro o que é a segunda variável, pense nela como uma
representação dos objetos na foto.

• Agora com os objetos identificados, contamos quantos objetos há


na foto. Como a foto está com muito ruído, calcularemos a área dos
objetos para desconsiderar objetos com área muito pequena.

• O cálculo da área é feito com a função regionprops, que também


calcula perímetro, inclinação e muitas outras coisas (consulte a
documentação do MATLAB para saber mais).
Solução Completa
Im = imread('lego.png');
imshow( Im);
azuis = Im(:,:,1) < 90;
imshow(azuis);
[B,L] = bwboundaries(azuis,'noholes');
stats = regionprops(L, 'Area');
qtd_azuis = sum([stats.Area] > 50);
qtd_azuis
Uma forma mais eficiente de exibir os resultados do
Exercício 1
Plotando os contornos obtidos pela função bwboundaries e exibindo as áreas calculadas pela função regionprops.

Im = imread('lego.png');
imshow( Im);
azuis = Im(:,:,1) < 90;
imshow(azuis);
[B,L] = bwboundaries(azuis,'noholes');
stats = regionprops(L, 'Area');
qtd_azuis = sum([stats.Area] > 50);
qtd_azuis

imshow(Im);
title(sprintf('\\fontsize{16} {Existem %d objetos azuis nessa imagem}', qtd_azuis));

hold on
for k = 1:length(B)
area = stats(k).Area;

if area > 50
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'black', 'LineWidth', 2);
text(boundary(1,2), boundary(1,1), sprintf('%.0f',area),...
'Color', 'white',...
'FontSize', 12,...
'FontWeight', 'bold',...
'BackgroundColor', 'black');
end
end
hold off
Atividade 4
• Faça um programa que mostre a quantidade
de peças peças vermelhas e amarelas na
mesma figura.

• Plote a área de cada peça (em número de


pixels) ao lado de cada uma delas.
Solução Ex.2: Separando e contando as peças vermelhas

%Separando somente as peças vermelhas


I = imread('lego.png');
verm=I(:,:,2)<40; % Separar o canal verde =G
subplot(2,2,1); imshow(I)
subplot(2,2,2); imshow(verm)

%Plotar somente áreas maiores do que 50 pixels


[B,L] = bwboundaries(verm,'noholes');
stats = regionprops(L, 'Area');
qtd_verm = sum([stats.Area] > 50);
qtd_verm
Solução Atividade 4: Separando e contando as peças
amarelas
FileName = 'lego.png' ;
[ImageMat cmap] = imread (FileName);
[ImageHeight ImageWidth NumColorPlanes] = size (ImageMat);
image (ImageMat)
NovaImagem = zeros (ImageHeight, ImageWidth, NumColorPlanes);
for y = 1:ImageHeight
for x = 1:ImageWidth
% Obtem o valor original de cada pixel RGB
redval = double (ImageMat(y, x, 1)); % double salva o valor entre 0 e 1 e não entre 0 e 255
greenval = double (ImageMat(y, x, 2));
blueval = double (ImageMat(y, x, 3));
% Altera um ou mais planos de cores
%redval = 0 ;
greenval = 0; %AMARELO= VERDE+VERMELHO, desligamos o canal verde
% blueval = 0 ;

% Salva o valor do Pixel RGB


NovaImagem(y, x, 1) = redval;
NovaImagem(y, x, 2) = greenval;
NovaImagem(y, x, 3) = blueval;
end
end
% Converte para 8 bits por cada componente RGB
NovaImagemRGB8 = uint8(NovaImagem);
image (NovaImagemRGB8);
% axis(‘off’);
Separando as peças amarelas e
vermelhas (juntas em branco)
%Separando as peças amarelas e vermelhas
% Separar o canal vermelho=1
verm=NovaImagemRGB8(:,:,1);
subplot(2,2,1); imshow(verm)
% mostra a nova figura
Mostrar na tela só as peças que estão “branquinhas”

pecas = NovaImagemRGB8(:,:,1)>225;

subplot(2,2,2); imshow(pecas)
%Conta o total de peças vermelhas + amarelas
[B,L] = bwboundaries(pecas,'noholes');
stats = regionprops(L, 'Area');
verm_amarel = sum([stats.Area] > 1000);
verm_amarel
Subtrai a quantidade de peças
vermelhas

amarel = verm_amarel - verm


amarel
A função regionprops

A função regionprops faz muito mais do que foi


feito no Exercício 1, ela pode calcular a inclinação,
área, perímetro, centróide e diversos outros
parâmetros de qualquer figura na imagem.
Estas características (inclinação, área, perímetro,
centróide, etc) são chamados DESCRITORES de
uma imagem e são muito importantes no
Reconhecimento de Imagem e na Visão
Computacional.
FILTRAGEM
Para que serve a Filtragem de Imagens?

A) Remoção de Ruídos
B) Extração de Características (Descritores)
C) Realce de Características
D) Detecção de Bordas (ou Contornos) nas
imagens.
Filtragem para remoção de ruído
• O script MATLAB abaixo abre a imagem das moedas e acrescenta
ruído do tipo “sal e pimenta” (salt & pepper) e também ruído tipo
Gaussiano na imagem:
I = imread('eight.tif');
subplot(1,3,1), imshow(I);
Isp =imnoise(I,'salt & pepper',0.03);
subplot(1,3,2), imshow(Isp);
Ig=imnoise(I,'gaussian',0.02);
subplot(1,3,3), imshow(Ig);
No exemplo do slide anterior usamos a função
imnoise para acrescentar ruído à imagem de
entrada. A intensidade de ruído é especificada
pela densidade percentual e pela variância
(com média zero), respectivamente. Explore
os efeitos da alteração destes parâmetros de
ruído e, também, outros efeitos de ruído que
esta função implementa.
Filtragem Gaussiana para reduzir os ruídos
Para reduzir o ruído de uma imagem, podemos
usar diversos tipos de Filtros digitais. Alguns
deles são:
a) Filtro de Média
b) Filtro de Mediana
c) Filtro de Ordem (Rank Filter)
d) Filtro Gaussiano
No próximo slide, mostramos um exemplo do
Filtro Gaussiano para reduzir ruído.
Filtragem Gaussiana de Imagem

k = fspecial('gaussian',[5,5],2);
I_g = imfilter (I,k);
Isp_g = imfilter(Isp,k);
Ig_g=imfilter(Ig,k);
subplot(1,3,1), imshow(I_g);
subplot(1,3,2), imshow(Isp_g);
subplot(1,3,3), imshow(Ig_g);

Neste exemplo definimos um filtro Gaussiano com núcleo 5X5 e desvio padrão =2 pela
Função fpsecial e o aplicamos às três imagens geradas com ruído. Explore diferentes
dimensões de núcleo e diferentes valores de desvios padrão para entender os efeitos
do filtro na imagem resultante.
Atividade 2
• Tome uma imagem em cores qualquer à sua
escolha e:
A) Transforme a imagem RGB para Escala de
Cinza;
B) Acrescente ruído Sal e Pimenta e ruído
Gaussiano nesta imagem.Mostre a imagem
com ruído na tela;
c) Use o filtro Gaussiano para eliminar o ruído.
Mostre o resultado após a aplicação do filtro.

Atividade 2-B
Aplique diversos filtros de ruído na imagem abaixo, que mostra 2 flores. Tente melhorar ao máximo a
imagem, eliminando o ruido o máximo que você puder. Mostre o resultado.
EXTRAÇÃO DE CONTORNOS
(BORDAS)
Detecção de Bordas
Extrair os contornos (bordas) das figuras em uma imagem é
também muito importante para o reconhecimento de
imagens. Extraindo as bordas podemos calcular (a partir de
tais bordas) vários descritores que podem ser úteis para
identificar a imagem. No entanto, não é qualquer medida
extraída da borda que serve como um bom descritor. Um
descritor para ser considerado bom deve ser invariante:

a) À translação;
b) À rotação;
c) Às mudanças de escalas da figura.
Filtros para detectar bordas
A detecção de bordas faz uso de operadores diferenciais (derivadas) para
detectar alterações nos gradientes de níveis de cinza ou de cores em uma
imagem. A detecção de bordas é dividida em 2 categorias principais:
de 1ª ordem e de 2ª ordem. Existem diversos algoritmos para detectar bordas
em uma imagem, entre eles cita-se:
Baseados em derivadas de 1ª Ordem:
a) Detector de Roberts;
b) Detector de Prewitt;
c) Detector de Sobel.
Baseados em derivadas de 2ª Ordem (segunda derivada ou Laplaciano):
a) Detector Laplaciano;
b) Detector Laplaciano de Gaussiana (LoG) ;
c) Detector de Passagem por Zero;
d) Detector de Canny (considerado o melhor dentre todos).
Detectando bordas com MATLAB
• O exemplo abaixo ilustra o uso do detector de Canny (2ª
Ordem) e de Prewitt (1ª Ordem) e mostras as duas imagens
lado a lado, para você comparar o funcionamento deste dois
tipos de filtros de bordas.
O “melhor” filtro depende de cada necessidade.

I = imread('cameraman.tif');
imshow(I)
BW1 = edge(I,'Canny');
BW2 = edge(I,'Prewitt');
imshowpair(BW1,BW2,'montage')
Atividade 5
• Aplique os seguintes filtros de borda na imagem a seguir, e
extraia os contornos da imagem:

a) Canny
b) Prewitt
c) Sobel
d) Laplacian Enviar os resultados para fambrini@unicamp.br
O titulo do email deve ser seu_nome_Ativ5
Atividade 6
• Atividade 6.
• a) Explique como funcionam os filtros
detectores de borda para imagens.
• b) Explique quais são os sistemas de Cores
que existem e quais as principais diferenças
entre eles.

Enviar no AVA ou então:


Enviar os resultados para fambrini@unicamp.br
O titulo do email deve ser seu_nome_Ativ5
Atividade 7
Esqueletos

• Pesquise o significado de ESQUELETO de uma


imagem. Mostre exemplos.
• Discuta algumas técnicas de esqueletonização.
Atividade 8

Pixel e Voxel
a) Discuta a diferença entre pixel e voxel
b) Dê exemplos de onde são usando os voxels.
PRAZO FINAL PARA ENTREGA DAS
ATIVIDADES

16 de Maio
Referências usadas na elaboração deste material

[1] Canny, John, "A Computational Approach to Edge Detection," IEEE


Transactions on Pattern Analysis and Machine Intelligence,Vol.
PAMI-8, No. 6, 1986, pp. 679-698.

[2] Lim, Jae S., Two-Dimensional Signal and Image Processing,


Englewood Cliffs, NJ, Prentice Hall, 1990, pp. 478-488.

[3] Parker, James R., Algorithms for Image Processing and Computer
Vision, New York, John Wiley & Sons, Inc., 1997, pp. 23-29.

Você também pode gostar