Escolar Documentos
Profissional Documentos
Cultura Documentos
https://www.youtube.com/watch?v=O4_kWEDd52o
Sugesto de Projeto: Rob que fala
Que tal fazer um projeto de um rob que fala o
nome das cores que ele enxerga atravs da
cmera ?
http://espeak.sourceforge.net/
import numpy as np
import cv2
# Carrega uma imagem em escala de cinza
img = cv2.imread('lenaTest3.jpg',0)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Obs: De modo geral, usar OpenCv bem mais complexo do que SimpleCV, a
estrutura de programao bem mais complicada.
OUTRAS OPERAES MORFOLGICAS
Alm da Dilatao, Eroso, Abertura e Fechamento,
existem muitas outras Transformaes Morfolgicas.
Todas elas dependem de se definir um Elemento
Estruturante adequado.
Os principais formatos dos elementos estruturantes so
mostrados a seguir:
OUTRAS OPERAES MORFOLGICAS
Image.logicalAND()
Faz um AND da imagem binria com a mscara
Image.logicalOR()
Faz um OR da imagem binria com a mscara
Image.logicalXOR()
Faz um XOR da imagem binria com a mscara
Image.logicalNAND()
Faz um NAND da imagem binria com a mscara
Image.floodFill()
funciona como a ferramenta balde de tinta em um editor de imagens.
Ela pode apagar determinadas reas da imagem.
Transformada TopHat
Em morfologia matemtica e processamento de imagens digitais, top-hat uma
operao morfolgica que extrai pequenos elementos e detalhes de imagens
dadas. Existem dois tipos: Transformada top-hat branca definida como a
diferena entre a imagem de entrada e sua abertura por algum elemento
estruturante:
#--------------------------------------------------------------------------------------------------------
Alguns parmetros que podem ser usados na funo watersheds( )
def watershed(self , color = False)
def watershed( self, mask=None, erode=2, dilate=2, useMyMask=False )
#---------------------------------------------------------------------------------------------------------
Observe que eliminou um par de linhas extras, mas a um custo de eliminar as linhas
laterais novamente.
Alterar o comprimento da linha no resolve o problema. As duas extremidades da imagem
ainda no foram achadas.
Na verdade, ele poderia criar o problema oposto.
s vezes, o algoritmo pode achar linhas muito pequenas e ele precisa saber se esses
pequenos segmentos de linha, na verdade, representam um maior linha contnua.
A funo findLines () pode ignorar pequenos espaos em uma linha, e reconhec-lo como
uma linha geral maior.
Por padro, a funo ir combinar dois segmentos de uma linha se a distncia entre eles
de 10 pixels ou menos. Voc pode usar o parmetro maxlinegap para ajustar como isso
funciona.
O exemplo que se segue permite um maior buraco entre linhas, potencialmente
permitindo-lhe descobrir algumas pequenas linhas que constituem a borda.
Exemplo: Ajustando a funo findLines()
from SimpleCV import Image
img = Image("block.png")
lines = img.findLines(threshold=10, maxlinegap=20)
lines.draw(width=3)
img.show()
O resultado restaura a linha de borda direita novamente, mas, mais uma vez,
ele encontra um monte de linhas indesejadas, como demonstrado na
Figura ao lado. Note-se que ao definir o comprimento mnimo da linha
diminuiu o nmero de linhas encontradas na figura, a adio de um
intervalo mais longo, em seguida, aumentou dramaticamente o nmero
de linhas.
Com o buraco maior (maior gap), os segmentos de linha podem ser combinados para satisfazer os
requisitos de comprimento da linha, e mais linhas so ento reconhecidas. Os dois ltimos
parmetros, cannyth1 e cannyth2, so limiares para o detector de bordas Canny. A grosso
modo, as bordas so detectados pela procura de mudanas no brilho. O primeiro destes
parmetros de limiar controla quanto o brilho tem de mudar para detectar uma borda. O
segundo parmetro controla o threshold para a ligao em conjunto vrias bordas. Ambos
estes parmetros agem da mesma maneira que os trs parmetros anteriores: valores
menores significam que mais linhas sero detectadas, o que poderia ser apenas a adio de
rudo. Por outro lado, valores maiores resultar em menos linhas detectadas, mas pode
significar que algumas linhas vlidas no esto sendo detectadas. O truque trabalhar com
os parmetros at que voc esteja em um intervalo que faz mais sentido para a sua
aplicao. Claro que, por vezes mais fcil do que simplesmente modificar a imagem para
reduzir o rudo, em vez de afinar os parmetros. O exemplo a seguir, encontra as linhas
desejadas no bloco de madeira:
from SimpleCV import Image
img = Image('block.png')
dist = img.colorDistance((150, 90, 50))
bin = dist.binarize(70).morphClose()
lines = bin.findLines(threshold=10, minlinelength=15)
lines.draw(width=3)
# Move as linhas desenhadas na imagem binria de volta para a imagem principal
img.addDrawingLayer(bin.dl())
img.show()
Nosso objetivo final...
... segmentar o bloco de madeira nas 4 arestas, conforme a foto acima, usando
a funo findLines() corretamente parametrizada.
Encontrando Crculos: findCircle()
Alm de linhas retas, voc tambm pode trabalhar com circulos. O mtodo para
encontrar caracteristicas circulares chamado findCircle(), e ele funciona da
mesma maneira que findLines(). Ele retorna um conjunto de caracteristicas [
FeatureSet() ] da figura circular encontrada e tambm tem parametros para
ajudar a ajustar a sensibilidade: Alguns parametros so
Canny: Este um parmetro de limite para o detector de bordas Canny. O valor
padro 100. Se voc definir um valor mais baixo, um maior nmero de crculos
ser reconhecido, enquanto um valor maior, ao contrrio, significam menos
crculos sendo detectados.
Thresh: Este o equivalente do parmetro threshold para findLines (). estabelece
quo perto uma borda tem que estar de um circulo tem que ser antes de ser
reconhecido. O valor padro para este parmetro 350.
Distance: Similar ao parmetro maxlinegap para findLines (). Ele determina o quanto o
blob pode estar proximo de uma circulo , antes de serem tratados como crculo.
Se deixado indefinido, o sistema tenta encontrar o melhor valor, com base na
imagem que est sendo analisado.
Tal como acontece com as linhas, existem funes featureset que so mais
apropriados quando se lida com crculos, tambm. Estas funes incluem:
raio (): Como o nome sugere, este o raio do crculo.
dimetro (): O dimetro do crculo.
permetro (): retorna o permetro da funcionalidade, que, no caso de um crculo,
o comprimento da circunferncia.
Encontrando Crculos: findCircle()
from SimpleCV import Image
img = Image("pong.png")
circles = img.findCircle(canny=200, thresh=250, distance=15)
circles = circles.sortArea()
circles.draw(width=4)
circles[0].draw( width=4)
img_with_circles = img.applyLayers()
edges_in_image = img.edges(t2=200)
final = img.sideBySide(edges_in_image.sideBySide(img_with_circles)).scale(0.5)
final.show()
Corners (cantos)
A grosso modo, os cantos so lugares em uma imagem onde duas linhas se
encontram.
Contudo, voc no seria capaz de dizer qual das duas linhas horizontais
pertence a parte superior ou inferior, ou qual das duas linhas verticais era
o lado esquerdo ou direito.
Cada canto, por outro, nico, e possivel identificar facilmente onde ele
est localizado na imagem.
findCorners()
A funo findCorners() analisa a imagem e retorna os locais onde todos os cantos possam
ser encontrados.
Note-se que um canto no precisa ser um ngulo reto em 90 graus.
Duas linhas que se cruzam em qualquer ngulo pode constituir um canto.
Tal como acontece com findLines() e findCircle (), a funo findCorners() retorna uma
featureset de todas as caracteristicas do canto que foi achado.
Tecnicamente, as funes usadas para encontrar essas coisas ainda funcionam, mas
o que eles vo voltar so valores padro e dados no verdadeiros sobre os cantos.
Similar s funes findLines() e findCircle(), a funo findCorners() tambm tem parmetros
para ajudar a determinar quais cantos so encontrados em uma imagem.
Treinar e testar seus programas de Machine Learning mais fcil se voc salvar seus
dados em um arquivo, geralmente classificados dentro de diretrios por Classes.
ConfusionMatriz (Matriz de Confuso) : Pode ser usado para ajudar voc a perceber o
quo bom seu Classificador funciona. Nenhum classificador 100% perfeito.
Imprimir quais classes so confundidas com quais outras classes ajuda a
melhorar o software.
Ilustrao bsica de como funciona o SVM
O algoritmo Support Vector Machine separa as classes atravs
do melhor hiperplano de separao ( bom para classes no-
linearmente separveis):
FeatureExtractors
FeatureExtractors pode ser usado para extrair os vetores de caracteristicas de
imagens e aramazena-los na forma de uma lista de numeros;
$ cd orange
$ python setup.py build
$ sudo python setup.py install
http://jonahgroup.github.io/SnackWatcher/Raspberry-Pi-3-for-Computer-Vision
"brownie (bolo)
"candy", (bala)
"cookie", (bolacha)
"package (pacote)
Exemplo Prtico: SnackClassifier
1 O programa snack-trainer.py extrai as caracteristicas dos objetos:
class SnackTrainer():
def __init__(self):
self.classifier = None
class SnackClassify():
def __init__(self):
pass
def load(self, classifierFile):
self.classifier = TreeClassifier.load(classifierFile)
def classify(self, imageFile):
image = Image(imageFile)
return self.classifier.classify(image)
def classNames(self):
return self.classifier.mClassNames
def parse_options(self, args):
# Parse command-line options
usage = "%prog [options] -c <classifier_file> -i <image>"
parser = OptionParser(usage=usage)
parser.add_option("-g", "--debug", action="store_true", dest="debug",
default=False,
help="debugging mode"),
parser.add_option("-c", "--classifier", action="store", dest="classifier_file",
default="",
help="load classifier from file"),
parser.add_option("-i", "--image", action="store", dest="image_file", default="",
help="classify this image file"),
def process():
snack_bot = SnackClassify()
snack_bot.parse_options(sys.argv)
classifierFile = snack_bot.options.classifier_file
imageFile = snack_bot.options.image_file
snack_bot.load(classifierFile)
class_name = snack_bot.classify(imageFile)
print class_name
"""
main program
"""
if __name__ == "__main__":
process()
Descrio completa do exemplo
https://github.com/jonahgroup/SnackClassifier/
commit/31851b5483664e55975576e444a272
6dda5fed61
Desafio
1- Rode o exemplo SnackClassifier na sua mquina;
2 Adaptar este exemplo para classificar folhas de rvores, usando as
imagens da pasta: Folhas de rvores
Circinatum
Glabrum
Garryana
kelloggii
Negundo
Macrophyllum