Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Escola Politcnica
Autor:
_________________________________________________
Daniel Ponciano dos Santos Barboza
Orientador:
_________________________________________________
Prof. Mariane Rembold Petraglia
Examinador:
_________________________________________________
Prof. Antonio Petraglia
Examinador:
_________________________________________________
Prof. Jos Gabriel Rodriguez Carneiro Gomes
Gabriel Rodriguez Carneiro Gomes
DEL
Julho de 2009
ii
DEDICATRIA
Dedico este trabalho minha famlia pelo suporte, compreenso e valores que
me guiaram durante a jornada do curso de graduao concluso deste projeto. Em
especial, agradeo minha me, Lucia Marina Ponciano dos Santos Barboza por sempre
priorizar minha formao e sem a qual no estaria aqui no pelo motivo natural, mas
por me conduzir at onde cheguei; minha amiga e namorada, Mariana Dias Costa, por
estar ao meu lado desde o momento que me transfere do IME at concluir meu ltimo
trabalho na UFRJ. Participou ativamente de cada momento acadmico sempre
compreensiva e decisiva em cada passo importante. E finalmente, minha querida av
Rita Ponciano Estrada, que mais uma me e um pai. Ao lado do meu av Neil Garcia
Estrada, fez todo o possvel para que seguisse meus estudos, sendo um apoio, e uma
inspirao.
iii
AGRADECIMENTO
iv
RESUMO
v
ABSTRACT
This work presents a study on the OpenCV library, for the development of
algorithms in order to improve the edge detection in images using the language C or
C ++. The study consists of an analysis of functions, tailing its use, applications, and
codes. A simple algorithm for detecting edges of submarine images is presented,
combining the studied functions.
vi
SIGLAS
vii
Sumrio
1 Introduo 1
2 Informaes adicionais 3
2.4 Canny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
viii
3 Algoritmo de Deteco de Bordas 39
4 Concluso 50
Bibliografia 52
ix
x
Captulo 1
Introduo
1.1 Tema
1.2 Delimitao
1
A biblioteca OpenCV, desenvolvida pela Intel em 2000, permite manipulao
de dados de imagens, manipulao de matrizes e vetores, desenvolvimento de rotinas de
lgebra linear, estruturas de dados dinmicas, desenvolvimento de algoritmos de
processamento de imagem, anlise estrutural, calibrao de cmera, anlise de
movimento (tracking), reconhecimento de objetos, GUI Bsica, e rotulagem de imagem.
Sua vantagem em relao ao MATLAB o fato de poder ser usada para programar em
vrias plataformas, como C/C++, Python, Visual Basic, Ruby, permitindo uma
integrao mais fcil com outros programas, evitando problemas de integrao e
facilitando no caso de desenvolvimento de softwares embarcados.
Este estudo visa analisar algumas funes aplicveis deteco de bordas e
ponderar a viabilidade do uso da mesma em algoritmos de deteco de bordas em
softwares embarcados.
1.3 Justificativa
1.4 Objetivos
2
tcnicas, sero apresentadas funcionalidades potencialmente interessantes para deteco
de bordas de dutos.
1.5 Metodologia
Captulo 2
Estudo da Biblioteca
3
Fig. 1 Imagem 1. Fig. 2 Imagem 2.
2.2 Sobel
void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder,
int aperture_size );
sendo:
src
Imagem fonte.
dst
Imagem destino.
xorder
yorder
aperture_size
4
O tamanho do Kernel de Sobel deve ser 1, 3, 5 ou 7. Em todos os casos, o kernel
de tamanho aperture_size x aperture_size utilizado separadamente para
calcular a derivada. Quando o aperture_size for 1, utilizado um kernel 3x1 ou
1x3 para x e y.
G = K * A;
Caso a entrada da funo fosse cvSobel (const CvArr* src, CvArr* dst, 1, 0, 3), o
kernel seria:
1 0 1
2 0 2 .
1 0 1
E este seria
1 2 1
0 0 0 ,
1 2 1
ou
1 2 1
0 0 0 ,
1 2 1
caso a entrada fosse cvSobel(const CvArr* src, CvArr* dst, 0, 1, 3), dependendo da
origem da imagem (campo origin da IplImage structure).
5
Segundo Gary Bradski e Adrian Kaehlerno, no livro Learning OpenCV [...]IF
src is 8-bit then the dst must be of depth IPL_DEPTH_16S to avoid overflow. [...].
Entretanto, durante esse estudo utilizando sobel, nenhum caso de overflow ocorreu com
diferentes tipos de imagens utilizadas em testes da funo.
Filtro Scharr
Trata-se de um filtro que usa uma matriz 3x3 especfica, dada por:
3 0 3
10 0 10
3 0 3
6
A seguir, nas Figs. 3 a 15, observaremos o comportamento das imagens das
Figs. 1 e 2 processadas por cvSobel. Estas esto ordenadas em linhas pelo tamanho do
aperture size, visando comparao dos parmetros X e Y em cada coluna.
Primeiramente, sero exibidos os resultados da imagem da Fig. 2 e posteriormente da
imagem da Fig. 1, seguindo os mesmos critrios.
7
Fig.3 Resultado da Fig.4 Resultado da Fig.5 Resultado da
imagem 2 processada por imagem 2 processada por imagem 2 processada por
cvSobel com parmetros cvSobel com parmetros cvSobel com parmetros
X=1, Y=0 e aperture size = X=0, Y=1 e aperture size = X=1, Y=1 e aperture size =
3. 3. 3.
8
Fig.9 Resultado da Fig.10 Resultado da Fig.11 Resultado da
imagem 2 processada por imagem 2 processada por imagem 2 processada por
cvSobel com parmetros cvSobel com parmetros cvSobel com parmetros
X=1, Y=1 e aperture size = X=1, Y=2 e aperture size = X=1, Y=3 e aperture size =
7. 7. 7.
Fig.12 Resultado da
imagem 2 processada por
cvSobel com parmetros
X=0, Y=1 e aperture size =
SCHARR.
9
2.3 Laplace
sendo:
src
Imagem fonte.
dst
Imagem destino.
aperture_size
Laplace (f) 2f + 2f
x2 y2
sendo as derivadas parciais obtidas usando o operador de Sobel, considerando o apertu-
re_size=1. O resultado gera a derivada rpida, que anlogo a convoluir a imagem ori-
ginal com o kernel:
10
0 1 0
1 4 1
0 1 0
11
Fig.16 Resultado da imagem 2 Fig.17 Resultado da imagem 2
processada por cvLaplace com aperture processada por cvLaplace com aperture
size = 1. size = 3.
12
Fig.22 Resultado da imagem 1 Fig.23 Resultado da imagem 1
processada por cvLaplace com aperture processada por cvLaplace com aperture
size = 3. size = 5.
2.4 Canny
sendo:
src
Imagem fonte.
edges
Imagem do Contorno.
threshold1
O primeiro threshold.
threshold2
O segundo threshold.
aperture_size
13
vada em x e em y e combinado com 4 derivadas direcionais: atravs da hipotenusa e
da funo arctg y/x aproxima-se a funo do setor que possui o maior gradiente e reali-
za-se a supresso das derivadas nos demais setores. Desta forma, encontra-se o mximo
no setor de maior gradiente e desconsideram-se as derivadas nas demais direes. Ana-
logamente, este algoritmo apresenta na imagem destino os pontos de descontinuidade da
imagem fonte, sendo utilizado amplamente para deteco de bordas.
14
Fig.24 Resultado da imagem 1 Fig.25 Resultado da imagem 1
processada por cvCanny com T1= 0, processada por cvCanny com T1= 110,
T2= 55 e aperture size = 3. T2= 155 e aperture size = 3.
15
Fig.30 Resultado da imagem 2 Fig.31 Resultado da imagem 2
processada por cvCanny com T1= 0, processada por cvCanny com T1= 110,
T2= 55 e aperture size = 5. T2= 155 e aperture size = 5.
2.5 PreCornerDetect
sendo:
src
Imagem fonte.
corners
Imagem da borda.
aperture_size
Dx2Dyy+Dy2Dxx - 2DxDyDxy,
16
onde Dk a primeira derivada e Dkj a segunda derivada da imagem.
2.6 CornerHarris
sendo:
src
Imagem fonte.
edges
17
Imagem que grava a resposta da deteco de Harris. (Deve ter o mesmo tamanho
que src)
block_size
det(M) - k*trace(M)2;
onde wi,j um peso que pode ser uniforme, mas frequentemente usado para criar uma
ponderao Gaussiana.
Uma propriedade interessante deste algoritmo descrita por Gary Bradski e Adri-
an Kaehlerno, no livro Learning OpenCV a sua aplicabilidade em objetos em movi-
mento. Ao comparar imagens com objetos em posies diferentes, possvel acompa-
nh-los apenas por seus cantos. Estes, ao serem calculados possuem autovalores espec-
ficos.
18
Analogamente s funes descritas anteriormente, embora as imagens dos
parmetros sejam arquivos do tipo CvArr, a funo aceita arquivos do tipo IplImage.
2.7 Resize
sendo:
src
Imagem fonte.
dst
Imagem Destino.
interpolation
Mtodo de Interpolao
19
CV_INTER_LINEAR interpolao bilinear (padro);
Esta funo apresenta quatro tipos de interpolaes, que so usadas tanto para
reduzir quanto para aumentar uma imagem. O CV_INTER_NN realiza uma interpola-
o baseada no valor de seu pixel mais prximo. J no CV_INTER_LINEAR, ocorre
uma ponderao entre os pixels mais prximos. No CV_INTER_AREA, o pixel em
questo a mdia dos pixels antigos em uma rea cujo centro fica onde est o novo pi-
xel. Por ltimo, h um ajuste baseado em uma spline cbica curva definida por pontos
de controle e ns (pontos que pertencem curva) dos pixels adjacentes 4x4, e final-
mente utiliza-se o valor correspondente na curva regio do pixel. Este mtodo cha-
mado CV_INTER_CUBIC.
20
Fig.39 Resultado da imagem 1
processada por cvResize com
tamanho 4000x3000.
2.8 Erode
sendo:
src
Imagem fonte.
dst
Imagem destino.
element
Estrutura usada para fazer a eroso. Se for NULL, utilizado uma estrutura
retangular 3x3.
iterations
21
A funo cvErode corri a src usando o kernel, elemento que determina a forma de uma
vizinhana de pixel sobre qual o mnimo usado para compor o novo pixel em questo:
As imagens fonte (src) e destino (dst) possuem o mesmo tamanho. Para preen-
cher determinado pixel da imagem destino, selecionamos o menor valor dentre os pixels
da imagem fonte, que esto dentro da mscara do kernel. Este kernel est ancorado no
pixel de src com as mesmas coordenadas que o pixel de dst que est sendo calculado.
Esta funo permite repetir n vezes este algoritmo, onde n o valor de iteraes.
Para imagens coloridas, devido ao fato da funo s receber imagens com um canal,
cada canal de cor deve ser processado separadamente.
Nas Figs. 40 a 48, vemos o efeito da reduo de tamanho do cano devido s per-
das perifricas pelo fato do mnimo ser externo figura, eliminando a cada iterao suas
bordas. As figuras foram nomeadas com o nmero de iteraes.
22
Fig.40 Resultado da Fig.41 Resultado da Fig.42 Resultado da
imagem 1 processada por imagem 1 processada por imagem 1 processada por
cvErode com 1 iterao. cvErode com 2 iteraes. cvErode com 3 iteraes.
2.9 Dilate
sendo:
src
23
Imagem fonte.
dst
Imagem destino.
element
Estrutura usada para fazer a operao dilatar. Se for NULL, utilizado uma
estrutura retangular 3x3.
iterations
A funo cvDilate dilata a src usando o kernel, elemento que determina a forma
de uma vizinhana de pixel sobre a qual o mximo usado para compor o novo pixel
em questo; ou seja
As imagens fonte (src) e destino (dst) possuem o mesmo tamanho. Para preen-
cher determinado pixel da imagem destino, selecionamos o maior valor dentre os pixels
da imagem fonte, que esto dentro da mscara do kernel. Este kernel est ancorado no
pixel de src com as mesmas coordenadas que o pixel de dst que est sendo calculado.
Esta funo permite repetir n vezes este algoritmo, onde n o nmero total de
iteraes. Para imagens coloridas, devido ao fato da funo s receber imagens com um
canal, cada canal de cor deve ser processado separadamente.
24
Nas Figs. 49 a 57, vemos o efeito da dilatao de tamanho do cano devido ao
derretimento das bordas, ampliando o brilho para as regies mais escuras da imagem
(cujo kernel sobrepe regies com tons mais claros).
2.10 DrawContours
25
void cvDrawContours( CvArr *img, CvSeq* contour, CvScalar
external_color, CvScalar hole_color, int max_level, int
thickness=1, int line_type=8, CvPoint
offset=cvPoint(0,0) );
sendo:
img
Imagens de onde os contornos sero desenhados.
contour
external_color
hole_color
Thickness
line_type
Nas Figs. 58 a 65, as imagens foram processadas por cvCanny e depois por cv-
DrawContours, com thickness<0.
26
Fig.58 Imagem original 1. Fig.59 Resultado da imagem 1
processada por cvDrawContours.
27
Fig.64 Imagem original 4. Fig.65 Resultado da imagem 4
processada por cvDrawContours.
2.11 Smooth
sendo:
src
Imagem fonte.
dst
Imagem destino.
smoothtype
Tipo de suavizao.
A descrio dos demais parmetros ser includa aps detalharemos cada um dos
cinco tipos de suavizao. O uso dos parmetros: param1, param2, param3, param4
ser explicado para cada caso.
28
CV_BLUR
Em relao s imagens fonte e destino, estas podem ter 8 bits sem sinal ou 32
bits com ponto flutuante. As imagens podem ter 1 ou 3 canais, ou seja, podem ser colo-
ridas. As Figs. 66 e 67 exibem a imagem 1 processada com o tipo de suavizao
CV_BLUR.
CV_BLUR_NO_SCALE
29
Nota-se que ao no escalonar a imagem, pode-se gerar um overflow. Desta for-
ma, ao usar imagens fonte de 8 bits, a imagem destino dever ter 16 ou 32 bits com si-
nal. Para imagens fonte com 32 bits com ponto flutuante, podem-se usar imagens desti-
no do mesmo tipo, porque grandezas diferentes so representadas atravs da variao do
ponto. Aumenta-se a ordem de grandeza e perde-se preciso. Em geral, para imagens, a
perda de preciso desprezvel. Neste caso, as imagens s podem ter um canal. Para
processar imagens em cor, deve-se processar cada canal separadamente e depois junt-
los.
CV_GAUSSIAN
O tamanho deste kernel pode ser definido de 3 maneiras. A primeira, atravs dos
parmetros param3 e param4, formando um kernel param3param4. A segunda, no
caso do ltimo parmetro ser nulo. O kernel ter tamanho param3param3. Por ltimo,
caso os dois parmetros sejam nulos, o tamanho do kernel definido pelas equaes
abaixo:
Em relao s imagens fonte e destino estas podem ter 8 bits sem sinal ou 32 bits
com ponto flutuante. As imagens podem ter um ou trs canais, ou seja, podem ser colo-
ridas. Este filtro, embora til, tem menor velocidade de processamento. As Figs. 68 e 69
exibem a imagem 1 processada com tipo de suavizao CV_GAUSSIAN.
30
Fig.68 Resultado da imagem 1 Fig.69 Resultado da imagem 1
processada por cvSmooth tipo processada por cvSmooth tipo
CV_GAUSSIAN com parmetros 3, 0, 0 e CV_GAUSSIAN com parmetros 3, 0, 3 e
0. 0.
CV_MEDIAN
Median filter (filtro mediano) O filtro seleciona o valor mediano dos pixels de
uma janela quadrada e atribui este valor ao pixel da posio correspondente na imagem
destino.
A imagem fonte e destino devem ser do tipo 8 bits sem sinal. Entretanto poss-
vel usar imagens coloridas, de trs ou quatro canais, alm das com apenas um canal.
Este tipo de filtro sensvel a rudos, pois estes podem ser utilizados como centro das
31
janelas, ampliando seu tamanho rea da janela toda. As Figs. 70 e 71 exibem a ima-
gem 1 processada com tipo de suavizao CV_MEDIAN.
CV_BILATERAL
Bilateral filtering (filtro bilateral) - aplicando filtro 3x3 bilateral com a cor sig-
ma =param1 e espao sigma=param2. O filtro Bilateral anlogo ao filtro gaussiano;
entretanto, o filtro gaussiano tem melhor desempenho em imagens com pequenas varia-
es entre os pixels, de forma que um rudo seja convoludo com o Kernel eliminan-
do-o. Porm ao aplic-lo em imagens com bordas, estas sofrem a suavizao correlacio-
nado-as com os pixels adjacentes. Com um processamento mais lento, o Filtro Bilateral
suaviza a imagem, mas o algoritmo no aplicado prximo a bordas.
Quanto ao uso de imagens, estas podem ter um ou trs canais de cores, e no caso
de trs, cada pixel calculado pela media dos correspondentes ao mesmo nos trs ca-
nais. O tipo da imagem deve ser 8 bits sem sinal. As Figs. 72 e 73 exibem a imagem 1
processada com tipo de suavizao CV_BLUR.
32
Na primeira imagem, ocorre a suavizao sem comprometimento das bordas.
Isto diferente do caso da segunda imagem devido aos valores altos dos parmetros pa-
ram1 e param2.
2.12 Threshold
sendo:
src
Imagem fonte
Dst
Imagem destino
Threshold
Limiar de corte.
max_value
Limiar mximo.
threshold_type
Tipo de threshold.
CV_THRESH_BINARY
33
Threshold Binaria
CV_THRESH_BINARY_INV
34
CV_THRESH_TRUNC
Truncado
CV_THRESH_TOZERO
Threshold to zero
35
CV_THRESH_TOZERO_INV
37
No que diz respeito s imagens, estas podem ser de 8 bits sem sinal ou 8 bits
com ponto flutuante. No primeiro tipo, estas podem gerar overflow, mas no o caso de
imagens analisadas neste estudo. Para imagens coloridas, cada canal dever ser processa-
do separadamente e concatenado em seguida.
2.13 HoughLines2
sendo:
image
Imagem fonte.
line_storage
Method
38
rho
Theta
threshold
param1
param2
As imagens podem ser do tipo 8 bits sem sinal. Para um desempenho satisfat-
rio, seu uso associado funo cvCanny antes de ser processada para que o algoritmo
defina os pontos com preciso. O Mtodo CV_HOUGH_STANDARD, assim como sua varia-
o CV_HOUGH_MULTI_SCALE, identifica linhas inteiras atravs de pontos gerando um
nmero maior de linhas comparado com CV_HOUGH_PROBABILISTIC, usada principal-
mente quando h pontos formando poucas linhas longas, principalmente porque h limi-
39
tao mnima para o comprimento e a funo s exibe segmentos. Podemos observar o
desempenho do mtodo CV_HOUGH_PROBABILISTIC atravs da Fig. 94.
Captulo 3
Algoritmo de Deteco de Bordas
3.1 Rotina do programa
40
Em um segundo momento exibir-se- o cdigo comentado. A seguir, sero
mostradas algumas imagens com entradas especficas exibindo o melhor resultado
possvel para vrios tipos de imagens.
i) Incluso de Bibliotecas.
#include <cv.h>
#include <cvaux.h>
41
#include <highgui.h>
#include <stdio.h>
#include <math.h>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
42
QString fileName = QFileDialog::getOpenFileName(this,
tr("Escolher arquivo fonte"), "", tr("Imagens (*.png *.jpg
*.bmp)"));
ui->lineEdit->setText(fileName);
}
void MainWindow::on_pushButton_2_clicked()
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Escolher arquivo de destino"), "", tr("Imagens (*.png *.jpg
*.bmp)"));
ui->lineEdit_2->setText(fileName);
}
void MainWindow::on_pushButton_3_clicked()
{
double threshold1;
double max_value1;
double threshold;
double max_value;
threshold1 = ui->doubleSpinBox_6->value();
max_value1= ui->doubleSpinBox_7->value();
threshold = ui->doubleSpinBox_5->value();
max_value= ui->doubleSpinBox_8->value();
/* Carregar imagem de entrada */
int tipo;
fonte = ui->lineEdit->text().toAscii();
destino = ui->lineEdit_2->text().toAscii();
tipo = ui->comboBox->currentIndex();
43
iv) Carrega a imagem caminho inserido no campo Nome do Arquivo Fonte.
vi) As imagens so convertidas para tons de cinza para que possam ser
processadas pela maioria das funes.
vii) Uma das imagens corroda para que se eliminem as letras da figura sem
que haja perda do tamanho.
44
deteco de bodas por Canny, fortemente orientada pela descontinuidade gerada por
cvThreshold.
if(ui->checkBox->checkState())
cvSaveImage(destino, img_tres);
cvNamedWindow( "Borda", 0 );
cvReleaseImage( &img_tres );
cvReleaseImage( &img_erodetres );
cvReleaseImage( &img_original );
Fim do cdigo.
45
A seguir, analisaremos o desempenho do algoritmo em cinco imagens
submarinas fornecidas para este fim. As imagens 1 e 2 j foram previamente ilustradas
nas Figs. 1 e 2. As imagens 3, 4 e 5 so mostradas nas Figs. 96 a 98.
Fig.98 Imagem 5.
46
Fig.99 Resultado da imagem 1 processada pelo programa de deteco de
bordas utilizando CV_THRES_BINARY, thres1 = 85 e thres2 = 85.
47
observar na Fig. 101. A imagem no consegue delimitar completamente as bolhas e ao
usar o mtodo threshold to zero invertido, fez com que as letras no fossem eliminadas.
48
interessante para deteco de bordas. Por tratarmos de canos, a aproximao dos pontos
a linhas extremamente razovel. Nota-se que a imagem gerada no possui pontos, mas
pequenos conjuntos de pixels alinhados no sentido das bordas. Sendo assim, antes de
executarmos a funo cvHoughLines2, a imagem pr-processada por cvDilate duas
vezes e uma vez por cvErode, visando a formao de pontos slidos e posteriormente
reduzidos por erode para um reconhecimento melhor da imagem ao traarem as linhas
de Hough. O mtodo usado foi CV_HOUGH_PROBABILISTIC.
49
Captulo 4
Concluso
50
reconhecer ou a borda no existe visivelmente na imagem original. Referente
aprendizagem de mquinas e ao reconhecimento de objetos, a funo novamente se
destaca, no s por funes complexas implementadas, mas por seu desempenho,
permitindo aplicaes em tempo real.
51
Bibliografia
[1] http://www.tecgraf.puc-rio.br/~malf/OpenCV/
[2] BRADSKI, G., KAEHLER, A., Learning OpenCV, Califrnia E.U.A., OReilly
Media, Inc., 2008.
[3] HARRIS, C., STEPHENS, M., A combined corner and edge detector, Proceedings
of the 4th Alvey Vision Conference (pp. 147151), 1988.
[4]http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filter
ing.html
[5] ALBUQUERQUE, M., ALBUQUERQUE, M., Processamento de Imagens:
Mtodos e Anlises, Rio de Janeiro - Brasil., Centro Brasileiro de Pesquisas Fsicas
CBPF/MCT - Coordenao de Atividades Tcnicas - CAT
[6] http://www.willowgarage.com/
[7] INTEL CORPORATION, OpenCV Reference Manual, E.U.A., Copyright 1999-
2001 Intel Corporation All Rights Reserved Issued in U.S.A. Order Number: 123456-
001
[8] J. CANNY, A computational approach to edge detection, IEEE Transactions
on Pattern Analysis and Machine Intelligence 8 (1986): 679714.
52