Академический Документы
Профессиональный Документы
Культура Документы
e
Reconhecimento de Padres
AULA 5
bw= imread(text.png)
se = [ 0 1 0; 1 1 1; 0 1 0 ]
bw_out= imdilate(bw,se)
subplot(1,2,1); imshow(bw);
subplot(1,2,2); imshow(bw_out);
Exemplo 2 MATLAB (EROSO)
bw= imread('text2.png')
se = ones(6,1);
bw_out= imerode(bw,se)
subplot(1,2,1); imshow(bw);
subplot(1,2,2); imshow(bw_out);
Funo strel (MATLAB)
A funo strel do Toolbox de Processamento de Imagens do MATLAB serve
para definir elementos estruturantes de diferentes formatos.
bw= imread('text2.png')
se1 = strel('square',4); % elem estrut quadrado
se2 = strel('line',5,45); % elem estrut reta
bw_1=imdilate(bw, se1);
bw_2=imdilate(bw, se2);
subplot(1,2,1); imshow(bw_1);
subplot(1,2,2); imshow(bw_2);
Efeitos e usos da eroso e dilatao
A eroso reduz o tamanho de um objeto binrio, enquanto a
dilatao o aumenta. A eroso tem o efeito de remover todas
as pequenas caractersticas isoladas, de separar regies
adjuntas e delgadas de uma caracterstica, de reduzir o
tamanho de objetos slidos erodindo-os nas fronteiras. A
dilatao tem um efeito aproximadamente reverso ao da
eroso: alarga e espessa regies estreitas, ressalta
caractersticas em torno das bordas. Dilatao e eroso so o
reverso uma da outra, embora no sejam inversas no sentido
matemtico. No possivel restaurar por dilatao um objeto
que tenha sido completamente removido por eroso.
Exemplo 3-Uso de dilatao e eroso para identificar caractersticas baseadas em
forma.
m1 = Image( sua_imagemRGB.png )
mp1 = m1.getNumpy()
f1 = mp1.flatten()
Fazendo Rotao no vdeo !
Este um efeito muito legal de processamento de imagens: O script a seguir
vai fazer rotao continua na imagem capturada pela cmera e tambm
aumenta progressivamente o ngulo de rotao:
Medindo objetos
Este segundo exemplo mais prtico: mostra como medir objetos com a
cmera. A idia bsica comparar o objeto que est sendo medido com
outro objeto de tamanho conhecido.
Por exemplo: Se um objeto est situado em cima do pedao de uma folha de
papel que mede 21,25 x 27,5 cm , podemos usar o tamanho conhecido da
folha de papel para determinar o tamanho do objeto. Entretanto, isso
complicado, se o papel no parecer quadrado para a cmera (ou seja, se o
papel visto em perspectiva).
O prximo exemplo mostra como consertar isso com a funo warp().
X=?
21,25cm
Medindo objetos
from SimpleCV import Image
warped = img.warp(corners)
bgcolor = warped.getPixel(240,115)
dist = warped.colorDistance(bgcolor)
blobs = dist.invert().findBlobs()
paper = blobs[-1].crop()
toyBlobs = paper.invert().findBlobs()
toy = toyBlobs[-1].crop()
paperSize = paper.width
toySize = toy.width
warped = img.warp(corners)
Deforma a imagem transformando-a no quadrado das bordas da folha de
papel, como mostrado na figura a seguir:
Explicando o cdigo
dist = warped.colorDistance(bgcolor)
Use o truque do image.live() tambm para encontrar a cor do
papel. Isso tornar mais fcil descobrir qual parte da imagem
o papel e qual parte so os objetos de fundo. A imagem a
seguir mostra o resultado. Perceba que o papel preto
enquanto o restante da imagem representado em vrios
tons de cinza.
Explicando o cdigo
blobs = dist.invert().findBlobs()
Fazendo preto o papel, fica mais fcil detectar a pea azul usando a funo
Blobs()
paper = blobs[-1].crop()
Agora recorta da imagem original o maior Blob (que o papel) e
isso representado por blobs[-1].
(-1) o maior blob encontrado na imagem.
Observe que este exemplo trabalha melhor com objetos planos. Quando
ajustamos o esquadro da imagem, isso faz a parte de cima do objeto
parecer mais larga do que a base, o que pode resultar em erros de
medida.
COR
E
SEGMENTAO
Segmentao
Segmentao o processo de dividir uma imagem em reas de
contedo relacionado.
Essas reas consistem de pixels que compartilham uma caracterstica
particular, e uma das caractersticas mais frequentemente usadas
a cor.
Neste caso, voc pode usar a cor para segmentar uma imagem e
remover o contedo do fundo da imagem, deixando apenas o
objeto de interesse.
Exemplo de Segmentao de imagem
colorida
from SimpleCV import *
yellowTool = Image( "yellowtool.png )
yellowDist = yellowTool.colorDistance((223, 191, 29))
yellowDistBin = yellowDist.binarize(50).invert()
yellowDistBin.show()
yellow_car = car.colorDistance(Color.YELLOW)
# Mostra os resultados
yellow_car.show( )
Subtrai agora a imagem em escala de cinzas da imagem cortada, para obtermos
somente a imagem do carro amarelo.
Para comparar esta imagem com a imagem que no tem o carro amarelo, deve haver
vrios tipos de medidas para representar o carro. Uma maneira simples de fazer
isso usando a funo meanColor().
Como o prprio nome diz, esta funo calcula a cor mdia de uma imagem:
From SimpleCV import *
car_in_lot = Image( "parking-car.png )
car_not_in_lot = Image( "parking-no-car.png )
car = car_in_lot.crop(470,200,200,200)
yellow_car = car.colorDistance(Color.YELLOW)
only_car = car - yellow_car
print only_car.meanColor()
No script acima, se a diferena entre os pixels for maior do que 10% ele vai dizer
que as balas foram mudadas (aumentaram ou diminuiram) ou seja, que
houve mudanas significativas entre a foto 1 e a foto 2.
Comentrios sobre o programa anterior
matrix = diff.getNumpy()
Lembre-se de que uma imagem essencialmente uma matriz de valores de
pixels. Portanto, para aplicar tcnicas matemticas em uma imagem, s
vezes mais fcil transformar esta imagem em formato de matriz. A
funo getNumpy () retorna uma matriz NumPy da imagem.
flat = matrix.flatten()
A matriz NumPy , na verdade, uma matriz tridimensional com as dimenses
640x 480 x 3.
Isto corresponde s dimenses de imagem de 640 x 480, com uma adicional
dimenso para os trs valores para vermelho, verde e azul.
No entanto, ao invs de trabalhar com uma matriz tridimensional, ser mais
rpido achatar esta em uma matriz de 1 dimenso: 921.600 x 1.
num_change = np.count_nonzero(flat)
Podemos usar Numpy (importado por padro no SimpleCV como "np") para
rapidamente contar o nmero de pixels diferentes de zero.
Se voc encontrar dificuldades, veja aqui outras maneiras de instalar esta library no Python:
https://www.raspberrypi.org/learning/visualising-sorting-with-python/lesson-1/plan/
Problemas com a instalao de matplotlib
http://stackoverflow.com/questions/27798829/importerror-
no-module-named-pyside
Ao invs de olhar o histograma geral, s vezes mais til dividir a imagem em seus
canais de cor a olhar para o equilbrio de cor.
Isto demonstrado no seguinte script:
red_histogram = red.histogram(255)
Uma vez que os canais de cor individuais so separados, gera o histograma, como foi
foi feito no exemplo da imagem com tons de cinza. Trs canais significa que temos
trs histogramas.
plot(red_histogram)
Traa os histogramas. Observe que cada comando plot espera at que a janela do
histograma esteja terminada.
Em outras palavras, o cdigo em primeiro lugar mostrar o histograma vermelho. O
histograma verde no ser exibido at que a janela do histograma vermelha seja
finalizada. Ento o histograma azul no ser exibido at que a janela do verde seja
finalizada.
Histogramas R,G e B
Funo Hue Peaks()
HUE SIGNIFICA MATIZ
Depois de olhar para a distribuio de diferentes cores em uma imagem, a prxima questo
lgica de identificar a cor dominante na imagem. Isto conhecido como encontrar os
picos de matiz (Hue Peaks) e feita utilizando a funo huePeaks() para encontrar a(s)
cor(es) dominante(s).
Apesar de uma imagem poder ser primeiro convertido para o formato de HSV e, em
seguida, um histograma pode ser calculado para obter as informaes de matiz, o
SimpleCV tem um atalho para fazer isso em qualquer formato de imagem. a funo
hueHistogram (). Ele funciona exatamente como a funo Histogram() mas no mostra
os nveis de cinza e sim os nveis de intensidade de cada cor componente.
from SimpleCV import *
img = Image('monalisa.png')
# calcula o histograma
histogram = img.hueHistogram()
plot(histogram)
# calcula os picos do histograma
peaks = img.huePeaks()
# imprime: [(12.927374301675977, 0.11747342828238252)]
print peaks
Comentrios sobre a funo HuePeaks()
[ (12.927374301675977, 0.11747342828238252) ]
A sada da funo huePeaks so dois nmeros neste caso.
Se houver um nico pico dominante, ento haver apenas um elemento na
matriz. O primeiro valor da o bin que ocorre com mais frequncia.
O segundo valor a porcentagem de pixels que correspondem a essa
cor.
Por exemplo, no exemplo acima, o valor 13 a mais comum, e aparece em
12% do total de pixels da imagem.
Este deve parecer aproximadamente correto dado o histograma da
imagem Monsa Lisa:
Esta informao pode ser utilizada para subtrair os matizes menos
frequentes.
Este truque semelhante aos exemplos anteriores que subtraem valores
com base na distncia de cor.
Usando a matriz para criar uma mscara
Experimente o script a seguir com a imagem monalisa
mask = img.createBinaryMask(color1=(130,125,100),color2=(0,0,0) )
Cria uma mscara binria,
usando os valores comprendidos entre color1 e color2
mask = mask.morphClose()
Usa a funo morphClose() para limpar o rudo restante na imagem
Motion Blur effect
Um dos truques clssicos em fotografia artstica utilizar uma exposio longa. Ao deixar o obturador da cmera
aberto, ele cria um efeito de borro, conforme os objetos se movem atravs do campo de Viso.
Embora as cmeras web no tenham persianas para replicar diretamente esse efeito, ele pode ser simulado
adicionando uma srie de imagens, efetivamente criando um borro de movimento.
cam = Camera()
frames_to_blur = 4
frames = ImageSet()
while True:
frames.append(cam.getImage())
pic.show()
Efeito Croma-Key
Agora voc vai aprender como se faz um dos efeitos de
Processamento de Imagens mais utilizados na TV e no
cinema: o Croma-Key.