S2iImage – Biblioteca Computacional para manipula¸c˜ ao de imagens digitais, com suporte a Regi˜ ao de Interesse (ROI)
Mathias JK Erdtmann Mar¸co de 2005
Cap´ıtulo 1
Introdu¸ c˜ ao
S2iImage ´e uma biblioteca computacional para manipula¸c˜ao de imagens digitais, com su- porte a Regi˜ao de Interesse (ROI). Isso significa que seu prop´osito ´e constituir de um conjunto de estruturas que facilite a manipula¸c˜ao de imagens e, al´em disso, permitir a manipula¸c˜ao de regi˜oes de interesse.
A partir desta biblioteca, desenvolver-se-´a todos os aplicativos e bibliotecas do grupo S2i que envolvam imagens em qualquer ponto do projeto.
O hist´orico da biblioteca come¸cou em 2001, com Alexandre Orth, com atualiza¸c˜oes em 2003, realizadas por Fernando Deschamps e, finalmente, sua reformula¸c˜ao em 2004-2005 por Alberto Pavim e Mathias Erdtmann
Cap´ıtulo 2
Proposta
A proposta inicial (ou concep¸c˜ao original) do projeto S2iImage ´e:
Cria¸c˜ao de uma biblioteca computacional para a manipula¸c˜ao de imagens di- gitais, com suporte a Regi˜ao de Interesse (ROI)
No entanto, levando-se em conta as etapas j´a realizadas e a realizar para satisfazer esta proposta, a proposta do projeto atual (2004–2005) ´e:
Alterar e reformular a atual biblioteca S2iimage de forma que satisfa¸ca sua concep¸c˜ao original
A raz˜ao da necessidade pela reformula¸c˜ao ´e, em parte, a n˜ao manuten¸c˜ao, que tornou a biblioteca inoperante (por obsolescˆencia) e tamb´em a necessidade que o grupo encontrou em atualizar certos conceitos que foram implementados de maneira n˜ao congruente com a literatura padr˜ao.
Cap´ıtulo 3
Requisitos
3.1 Objetivo
Refomular a atual biblioteca S2iImage.
3.2 Requisitos
3.2.1 Classifica¸c˜ao dos Requisitos
Os requisitos deste projeto foram classificados de acordo com a seguinte nomenclatura:
• Alta prioridade: requisitos essenciais ao projeto e ao funcionamento da biblioteca. O objetivo do projeto depende diretamente do cumprimento de todos os requisitos com esta prioridade.
• M´edia prioridade: requisitos desej´aveis ao projeto, mas n˜ao essenciais. O n˜ao cum- primento destes requisitos n˜ao afeta o objetivo do projeto, mas acarreta uma redu¸c˜ao significativa na funcionalidade da biblioteca.
• Baixa prioridade: requisitos desej´aveis ao projeto, n˜ao essenciais e que est˜ao ligados a aplica¸c˜oes espec´ıficas e especializadas da biblioteca. O n˜ao cumprimento destes requi- sitos n˜ao afeta a funcionalidade da biblioteca, uma vez que estes requisitos podem ser implementados no futuro, quando e se necess´ario.
3.2.2 Listagem de Requisitos (A numera¸c˜ao ´e para referˆencia apenas)
No. Prioridade Descri¸c˜ao
1 Alta O c´odigo fonte da biblioteca deve ser compat´ıvel com os padr˜oes ISO C++.
2 Alta A biblioteca deve ser compil´avel em todas as arquiteturas nas quais seja poss´ıvel compilar a biblioteca OpenCV e para as quais exista um compilador de C++ compat´ıvel com os padr˜oes ISO C++.
3 Alta A biblioteca deve suportar completamente imagens de uma e trˆes camadas.
4 M´edia A biblioteca deve suportar imagens de quatro camadas.
5 Alta A biblioteca deve suportar v´arias profundidades de ca- mada.
6 Alta A biblioteca dever´a suportar aritm´etica de imagens 7 Alta A biblioteca dever´a suportar aritm´etica e comparadores
booleanos de imagens
8 Alta A biblioteca dever´a ser capaz de armazenar e restaurar imagens de arquivos
9 M´edia A biblioteca dever´a ser capaz de armazenar e restaurar imagens de arquivos em formato PGN/MNG
10 Alta A biblioteca dever´a suportar manipula¸c˜ao de ROIs 11 Alta Dever´a ser lan¸cada uma vers˜ao que mantenha compati-
bilidade com a vers˜ao anterior.
Cap´ıtulo 4
An´ alise
Ser´a definido abaixo a biblioteca S2iImage, e esta defini¸c˜ao ´e crucial, pois ´e sobre ela que construiu-se toda a an´alise aqui apresentada.
S2iImage – Biblioteca Computacional para manipula¸c˜ao de Imagens Digitais, com suporte a Regi˜ao de Interesse
Procura-se deixar claro que, com manipula¸c˜ao de imagens refere-se a execu¸c˜ao de opera¸c˜oes atˆomicas (m´ınimas opera¸c˜oes a se realizar). A execu¸c˜ao de opera¸c˜oes compostas (v´arias opera¸c˜oes de manipula¸c˜ao) ´e denominada processamento.
Para satisfazer os requisitos 1 e 2, ser´a realizada a implementa¸c˜ao primeiramente para GNU/linux, a ser compilada com o compilador gcc. Assim, assegura-se a portabilidade do c´odigo a todos sistemas operacionais que suportam tal compilador. Em adi¸c˜ao, ser´a reali- zada um posterior ajuste do c´odigo para que o mesmo possa ser utilizado com o compilador propriet´ario Visual C++ 6.0.
A vers˜ao antiga da S2iImage j´a suportava imagens de 1 e 3 camadas, embora as funciona- lidades n˜ao para uma ou para outra acabaram se restringindo com o passar do tempo. Ser˜ao feitas todas as adapta¸c˜oes necess´arias para que o suporte seja total. Sistemas de cores de quatro camadas s˜ao tamb´em interessantes, mas n˜ao s˜ao usualmente aplicadas, de forma que, a princ´ıpio, n˜ao existe necessidade absoluta de seu uso. De qualquer forma, a biblioteca ser´a implementada de forma estruturada, capaz de oferecer suporte a bibliotecas de um n´umero de canais arbitr´ario.
Tomando-se o devido cuidado na implementa¸c˜ao, n˜ao ´e muito restritiva a necessidade de suporte a v´arias profundidades de canal. Isto j´a vinha sendo feito na S2iImage, e bastar´a manter a estrutura atual. Quanto `as opera¸c˜oes executadas pela biblioteca, julgou-se necess´aria as opera¸c˜oes aritm´eticas (+,-,*,/, etc), booleanas (&&, ——, , etc), armazenamento em v´arios formatos de imagem (SalvarImagem e AbrirImagem), acesso e definicao dos valores dos pixels (Get, Set) e manipula¸c˜ao de ROIs (CriarROI, DestruirROI, etc). Estas opera¸c˜oes foram consideradas opera¸c˜oes minimais, ou seja, aquelas que cumprem a defini¸c˜ao da biblioteca sem excessos. Desta forma, como era o pr´oprio intuito da biblioteca ser minimalista, todas as fun¸c˜oes que n˜ao se enquadrarem nestas se¸c˜oes devem ser removidas.
A remo¸c˜ao e/ou altera¸c˜ao muito grande acarretar´a em falta de compatibilidade e para alertar os usu´arios das mudan¸cas, as mesmas devem ser expostas claramente no c´odigo, na documenta¸c˜ao e, se poss´ıvel, na compila¸c˜ao. Ser´a lan¸cada uma vers˜ao chamada de“deprecated version”, que manter´a compatibilidade com a vers˜ao anterior mas cujo funcionamento n˜ao est´a assegurado. Ap´os isso ser´a lancada a vers˜ao da nova S2iImage, que n˜ao possuir´a as fun¸c˜oes consideradas falhas.
Cap´ıtulo 5
Modelagem
Optou-se por n˜ao alterar em demasia a estrutura original da biblioteca, pois sua concep¸c˜ao original ´e v´alida. Em linhas gerais, a biblioteca S2iImage est´a galgada na biblioteca OpenCV, e sua principal classe, a S2iImage, ´e derivada daestrutura IplImage, da OpenCV.
No entanto, o uso de IplImages para manipula¸c˜ao ´e um tanto complexo e incomum, criando a necessidade de facilita¸c˜ao do acesso aos recursos, que ´e a principal fun¸c˜ao da S2iImage.
Desta forma, caracterizou-se como procedimento de manipula¸c˜ao todo aquele que pode ser implementado por meio de operadores e que ser˜ao, portanto, implementados por operadores.
As classes dever˜ao ter, al´em dos operadores, fun¸c˜oes “Get/Set” para tomar e alterar (quando aplic´avel) os atributos da classe.
Ser˜ao feitos ainda sobrecargas para os tipos mais usuais de aplica¸c˜oes.
Na biblioteca atual, existem as classes fast, que dever˜ao ser removidas, uma vez que seu
´
unico prop´osito ´e “tornar mais r´apido o acesso aos dados da imagem”. Tal fato n˜ao foi comprovado (em termos de performance), e sua funcionalidade ser´a incorporada nas classes padr˜ao.
5.1 Projeto Estrutural
Segue o diagrama antes da remo¸c˜ao das classes (figura 5.1) e depois (5.2). Nota-se no diagrama duas novas classes de imagem, a S2iImageBGR24 e a S2iImageCMYK32, que seriam as classes de imagens coloridas com trˆes camadas de cores (azul, verde, vermelho) e quatro camadas de cores (ciano, magenta, amarelo e preto), respectivamente.
Figura 5.1: Antigo diagrama de classes da S2iImage
Figura 5.2: Novo diagrama de classes da S2iImage
5.2 Projeto Executivo
Ainda na figura 5.2, percebe-se que as classes filhas da classe S2iImage possuem seus parˆametros templates definidos. Isto ´e feito para facilitar o trabalho do desenvolvedor que utilizar a biblioteca e para diferenciar as classes, uma vez que os parˆametros template s˜ao a principal caracter´ıstica das classes filho (profundidade, n´umero de canais).
Cap´ıtulo 6
Implementa¸ c˜ ao
A documenta¸c˜ao do c´odigo foi realizada utilizando a ferramenta Doxygen.
A mesma podem ser encontrada no diret´oriodocda pasta ra´ız do m´odulo, em formatohtml e LATEX. Constam na documenta¸c˜ao todas as fun¸c˜oes consideradas obsoletas e a descri¸c˜ao das novas fun¸c˜oes, devidamente separadas em categorias, para f´acil compreens˜ao.
Programa-se futuras modifica¸c˜oes na biblioteca, caso as novas vers˜oes da biblioteca OpenCV o fa¸cam necess´ario.
A seguir encontra-se a lista de fun¸c˜oes e estruturas consideradas obsoletas (mais in- forma¸c˜oes na documenta¸c˜ao do c´odigo):
• int AddROI (S2iRect const &a oROIRect, S2iImage< TDataType, TColorLayers, TI- mageDepth>*a poROI)
• S2iImageStatus ShiftROI (float const &a fShiftX, float const &a fShiftY=0)
• S2iImageStatus ResizeROI (S2iRect const &a oROIRect)
• int const OffsetX () const
• int const OffsetY () const
• virtual TDataType const & GetIntensity (int const a nX, int const a nY, int const a nLayer=0) const
• TDataType * GetDataPtr ()
• TDataType const * GetDataPtr () const
• TDataType * GetLinePtr (int const a nY)
• TDataType const * GetLinePtr (int const a nY) const
• vector<TDataType>GetCol (int const a nNr, int const a nLayer=0) const
• unsigned int GetChannelsNumber () const
• int const Width () const
• int const Height () const
• int const Size () const
• virtual S2iImageStatus SetPixel (S2iPixel< TDataType, TColorLayers, TImageDepth
>const a oValue, int const a nX, int const a nY)
• S2iImageStatus SetDataPtr (void *a pData)
• S2iImageStatus SetAllEntries (TDataType const &a oValue)
• S2iImageStatus SetAllEntries (S2iPixel< TDataType, TColorLayers, TImageDepth >
const &a oValue)
• S2iImageStatus SetRowEntries (TDataType const &a oValue, int const aRowNr)
• S2iImageStatus SetRowEntries (S2iPixel<TDataType, TColorLayers, TImageDepth>
const &a oValue, int const aRowNr)
• S2iImageStatus SetColEntries (TDataType const &a oValue, int const aColNr)
• S2iImageStatus SetColEntries (S2iPixel< TDataType, TColorLayers, TImageDepth >
const &a oValue, int const aColNr)
• int IsLegalPixel (int const a nX, int const a nY) const
• bool IsOK () const
• bool IsPrimaryROI () const
• S2iImageStatus Copy (S2iImage< TDataType, TColorLayers, TImageDepth > const
&a oSourceImage)
• S2iBinaryImage * operator && (TDataType const &a oValue) const
• S2iBinaryImage * operator && (S2iPixel<TDataType, TColorLayers, TImageDepth>
const &a oPixel) const
• S2iBinaryImage * operator && (S2iImage< TDataType, TColorLayers, TImageDepth
>const &a oSourceImage) const
• S2iBinaryImage * operator—— (TDataType const &a oValue) const
• S2iBinaryImage * operator—— (S2iPixel< TDataType, TColorLayers, TImageDepth
>const &a oPixel) const
• S2iBinaryImage * operator—— (S2iImage< TDataType, TColorLayers, TImageDepth
>const &a oSourceImage) const
• S2iBinaryImage * operator! () const
• S2iImage<TDataType, TColorLayers,TImageDepth>const & operator<<= (unsigned int const &a nValue)
• S2iImage<TDataType, TColorLayers,TImageDepth>const & operator>>= (unsigned int const &a nValue)
• S2iImageStatus CalcMinMax (S2iPixel< TDataType, TColorLayers, TImageDepth >
&a oMinPixel, S2iPixel< TDataType, TColorLayers, TImageDepth > &a oMaxPixel,
• double SumPixels (int a nPlan=ALL LAYERS) const
• double Mean (int a nPlan=ALL LAYERS) const
• S2iImageStatus Mean (double &a fMean, double &a fStdDev, int a nPlan=ALL LAYERS) const
• double Norm (int a nNormType=CV C, int a nPlan=ALL LAYERS) const
• double Norm (S2iImage<TDataType, TColorLayers, TImageDepth>const &m oSecondImage, int a nNormType=CV C, int a nPlan=ALL LAYERS) const
• S2iImageStatus CompareImage (S2iImage< TDataType, TColorLayers, TImageDepth
>const &a oSourceImage)
• S2iImageStatus ImageNormalize (double const &a fModelImageMean, int a nPlan=ALL LAYERS)
• S2iImageStatus NormalizeInRange ()
• S2iImageStatus Zoom (int a nSrcWidth, int a nDestWidth, int a nSrcHeight, int a nDestHeight,
S2iImage<TDataType, TColorLayers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus Move (double const &a fShiftX, double const &a fShiftY, double const
&a fAngle=0, S2iImage<TDataType, TColorLayers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus Shift (double const &a fShiftX, double const &a fShiftY, S2iImage<
TDataType, TColorLayers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus Rotate (double const &a fAngle, double const &a fCenterX=0, double
const &a fCenterY=0, S2iImage<TDataType, TColorLayers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus Mirror (S2iMirrorFlipAxis a nFlipAxis, S2iImage< TDataType, TCo- lorLayers, TImageDepth>*a pDestImage=NULL)
• S2iImageStatus LinearTransform (double const &a fShearX, double const &a fShearY, double const &a fShiftX, double const &a fShiftY, S2iImage< TDataType, TColor- Layers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus LinearTransform (double const a fCoeffs[2][3], S2iImage< TDataType,
TColorLayers, TImageDepth>*a pDestImage=NULL, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus BilinearTransform (double const a fCoeffs[2][4], S2iImage<TDataType,
TColorLayers, TImageDepth>*a pDestImage=NULL, int t nFlag=0, int a nInterpolationTyp=IPL INTER NN)
• S2iImageStatus PerspectiveTransform (double const a fCoeffs[3][3], S2iImage< TDa-
taType, TColorLayers, TImageDepth>*a pDestImage=NULL, int t nFlag=0, int a nInterpolationTyp=IPL INTER NN)
• S2iImage<TDataType, TColorLayers, TImageDepth>const & MultiplyScale (S2iPixel<
TDataType, TColorLayers, TImageDepth >const &a oPixel)
• S2iImage<TDataType, TColorLayers, TImageDepth>const & MultiplyScale (S2iImage<
TDataType, TColorLayers, TImageDepth >const &a oSourceImage)
• S2iImageStatus PixelLinearTransform (double const &a oAlfa, double const &a oBeta, int a nPlan=ALL LAYERS)
• S2iImage<TDataType, TColorLayers,TImageDepth> const & Invert ()
• S2iImage< TDataType, TColorLayers,TImageDepth > const & MultiplyScale (TDa- taType const &a oValue)
• S2iImageStatus SetROIDataPtr (void *a pData)
• S2iImageStatus SetRowsPtr ()
• S2iLib::S2iPixelFast<TDataType, TColorLayers >
• S2iLib::S2iImageFast<T, C>
Muitas fun¸c˜oes e, principalmente, operadores foram criados para executar as opera¸c˜oes antes executadas pelas fun¸c˜oes tidas como obsoletas. Algumas vezes as fun¸c˜oes obsoletas foram simplesmente removidas do c´odigo, por n˜ao satisfazer a defini¸c˜ao da biblioteca original.
Cap´ıtulo 7
Testes
Para fins de testes da biblioteca, gerou-se um programa exemplo, situado na pasta chamada examplesda pasta ra´ız do m´odulo.
O programa exemplo servem ainda para que o programador se acostume com a utiliza¸c˜ao da biblioteca, encontrando nele exemplos para o uso das fun¸c˜oes.
Desta forma, assim puderam ser testadas as principais fun¸c˜oes implementadas, e verificar se havia uso de fun¸c˜oes obsoletas internamente. Ap´os os testes, foram verificados alguns erros, que foram eliminados at´e que fosse satisfeito os requisitos necess´arios.
Testou-se as fun¸c˜oes para imagens preto e branco, BGR e gen´ericas (profundidade definidas pelo usu´ario). Ap´os o testes, garante-se cerca de 90% de bom funcionamento da biblioteca, sendo que testes mais apurados ser˜ao realizados com a utiliza¸c˜ao da biblioteca para constru¸c˜ao de m´odulos posteriores.
Cap´ıtulo 8
Apˆ endices
8.1 Cronograma
Tarefa Data Limite
Verificar diferen¸cas nas diferentes vers˜oes da biblioteca (S2i, WZL) 2004-09-24
Documenta¸c˜ao preliminar 2004-10-08
Elaborar documentos de requisitos e an´alise de novo! 2004-10-15
Remodelagem da biblioteca 2004-10-22
Reimplementa¸c˜ao e redocumenta¸c˜ao da biblioteca 2004-11-05
Testes da bilbioteca 2004-11-19
Incluir funcionalidades PNG e MNG a classe S2iImage 2004-11-30
Elabora¸c˜ao de Aplicativos 2004-12-03
Documenta¸c˜ao final atualizada na p´agina do S2i 2005-03-31
8.2 Equipe
Pariciparam da cria¸c˜ao da vers˜ao anterior da bilbioteca (em ordem cronol´ogica):
• Alexandre Orth
• Fernando Deschamps
A corrente reformula¸c˜ao, por sua vez, foi realizada por:
• Alberto Xavier Pavim
• Mathias JK Erdtmann
Pretende-se utilizar esta biblioteca em todos os projetos sunseq¨uentes do laborat´orio Sis- temas Industriais Inteligentes que envolvam manipula¸c˜ao de imagens.
8.3 Hardware & Software
Para o corrente projeto de remodelamento da biblioteca, conta-se com a estrutura f´ısica do laborat´orio Sistemas Industriais Inteligentes, integrante do Laborat´orio Integrado do De- partamento de Automa¸c˜ao e Sistemas da Universidade Federal de Santa Catarina.
De forma geral ser´a buscada a utiliza¸c˜ao de ferramentas software livre para o desenvolvi-
8.4 Problemas
A ferramenta de desenvolvimento propriet´aria MS-Visual C++6.0 n˜ao ´e capaz de lidar com atributos de obsolescˆencia (DEPRECATED) no c´odigo, para o qual n˜ao se encontrou solu¸c˜ao retaliativa alguma sen˜ao a documenta¸c˜ao das fun¸c˜oes obsoletas da forma mais clara poss´ıvel.
A integra¸c˜ao das funcionalidades PNG e MNG n˜ao foram inclu´ıdas ainda na biblioteca por complica¸c˜oes administrativas de pessoal, no entanto permanecem como requisito de grande prioridade.
8.5 Correio
Eletrˆonico: erdtmann@das.ufsc.br(Mathias JK Erdtmann);axpavim@das.ufsc.br(Al- berto Xavier Pavim)
Convencional: Campus Universit´ario Caixa Postal 476 - CEP: 88040-900 - Florian´opolis - SC - Fone: +55 48 331 7598 - Fax: 48 331-9934
8.6 Referˆ encias
[1] Intel Corporation. Open Source Computer Vision Library - Reference Manual 2001. [2] http://www.intel.com/research/mrl/research/opencv/ [3] Documenta¸cao do C´odigo OpenCV [4] Documenta¸cao do C´odigo S2iImage