Treinamento de Processamento Digital de Imagens usando OpenCv em C++

Instruções gerais

Este treinamento básico de Processamento Digital de Imagens com OpenCv usando Linguagem C++ foi usado, desenvolvido e focado no ensino de PDI para os alunos do Grupo de Pesquisa de Sistemas Inteligentes (GPSI) do IFCE-Maracanaú. Após este treinamento, cada aluno que trabalha com PDI no mesmo foca seus estudos em uma área específica de aplicação e de pesquisa, realizando um bom estudo bibliográfico e pesquisas utilizando a biblioteca OpenCv em aplicações reais e práticas.

Deste modo, todas as aplicações devem ser exercitadas e compreendidas, devendo ser também armazenadas para que no futuro vocês possam resgatar cada implementação quando necessário. Sendo assim, cada um dos tópicos a seguir deve ser implementado e salvo em pasta própria juntamente com todos os arquivos de entrada e todos os arquivos gerados.

Links Importantes:

Link 1. Tutorial de Instalação e configuração da OpenCv 2.49 no Visual Studio 2012.

Link 2. Tutorial básico sobre OpenCv.

Link 3. Soluções utilizando a estrutura CvMat

Laboratório de Apoio – LAPISCO – website – página no  Facebook

Tópicos à ser respondidos neste treinamento:

Tópico 1 – Abrir uma imagem colorida, visualizar e salvar.

Tópico 2 – Abrir uma imagem colorida, transformar em níveis de cinza, visualizar e salvar imagem gerada.

Tópico 3 – Abrir uma imagem colorida em RGB, visualizar e salvar cada um dos canais separadamente. Obs: Busquem compreender o que significa cada um dos canais.

Tópico 4 – Abrir uma imagem colorida, transformar em HSV, visualizar e salvar cada um dos canais separadamente. Obs: Busquem compreender o que significa cada um dos canais.

Tópico 5 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Apliquem os filtros passa baixa mediana (cv_median) e media (cv_blur), visualizem os resultados e salvem. Obs: busquem compreender os resultados de cada filtro.

Tópico 6 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Apliquem os filtros passa alta de canny (cv_canny), visualizem os resultados e salvem. Obs: busquem compreender os resultados do filtro.

Tópico 7 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Apliquem uma limiarização (thresholding), visualizem os resultados e salvem. Obs: busquem compreender os resultados da técnica.

Tópico 8 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Apliquem um redimensionamento da imagem, reduzindo e depois aumentando seu tamanho, visualizem os resultados e salvem. Obs: uma imagem 320×240 deve virar uma 160×120 em primeiro caso e 640×480 em segundo caso.

Tópico 9 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Criem uma matriz de forma estática com as mesmas dimensões da imagem de entrada (vejam nas propriedades da imagem no Windows), peguem cada um dos pixels da imagem e coloquem na matriz que criaram. Imprimam esta matriz em um arquivo de texto (*.txt) do mesmo modo que ela está alocada.

Tópico 10 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Criem uma matriz de forma estática com as mesmas dimensões da imagem de entrada (vejam nas propriedades da imagem no Windows), peguem cada um dos pixels da imagem e coloquem na matriz que criaram. Apliquem uma limiarização fazendo uma varredura na matriz. Imprimam esta matriz em um arquivo de texto (*.txt) do mesmo modo que ela está alocada.

Tópico 11 – Abrir uma imagem colorida com o fundo branco e um quadrado preto centralizado, transformar em tom de cinza, visualizar imagem de entrada. Criem uma matriz de forma estática com as mesmas dimensões da imagem de entrada (vejam nas propriedades da imagem no Windows), peguem cada um dos pixels da imagem e coloquem na matriz que criaram. Calculem as coordenadas (xc,yc) que representam o centróide deste quadrado. Tentem pintar ou marcar ele na imagem para visualização. Xc será a média todas as coordenadas x que fazem parte do quadrado, e yc é as médias de y do quadrado. As coordenadas do quadrado são identificadas pelo tom preto(valor 0). Façam esta imagem de entrada no Paint.

Tópico 12 – Abram um arquivo de texto (pode ser o mesmo gerado no tópico 10), criem uma imagem em tom de cinza e visualizem esta imagem.

Tópico 13 – Abrir uma imagem colorida, transformar em tom de cinza, visualizar imagem de entrada. Criem uma matriz de forma estática com as mesmas dimensões da imagem de entrada (vejam nas propriedades da imagem no Windows). Apliquem uma convolução fazendo uma varredura na matriz utilizando as máscaras do operador gradiente Sobel (procurem no google). Visualizem os resultados e salvem. Obs: busquem compreender os resultados do operador Sobel (parece com o de canny, apenas parece).

Tópico 14 – Abrir uma câmera, capturar uma imagem (frame), transforme em tom de cinza, visualizar imagem de entrada. Continue infinitamente capturando, transformando em tom de cinza e vizualizando.

Tópico 15 – Abrir uma câmera, capturar uma imagem (frame), transforme em tom de cinza, visualizar imagem de entrada, aplique o filtro de canny e visualize os resultados. Continue infinitamente capturando, transformando em tom de cinza, aplicando canny e visualizando.

Tópico 16 – Abrir uma imagem colorida, transformar para tom de cinza e aplicar uma Equalização de histograma utilizando a OpenCv, visualizando a imagem de entrada e seu respectivo histograma inicialmente, e, em seguida, o resultado da equalização e seu histograma. Esta técnica aumenta o contraste da imagem.

Tópico 17 – Abrir uma imagem colorida, transformar para tom de cinza e aplicar uma Equalização de histograma utilizando apenas o conhecimento de manipulação da imagem, sem a OpenCv, visualizando a imagem de entrada e seu respectivo histograma inicialmente, e, em seguida, o resultado da equalização e seu histograma. Esta técnica aumenta o contraste da imagem

Tópico 18 – Abrir uma imagem colorida, transformar para tom de cinza e aplicar o operador gradiente Laplaciano, aplique a técnica de Equalização no resultado obtido na detecção das bordas, onde a maior intensidade de borda seja 255, e a menor intensidade da borda seja 0.

Tópico 19 – Abrir uma imagem colorida, transformar para tom de cinza e aplicar o operador gradiente Sobel, visualizando a imagem de entrada e seu respectivo histograma inicialmente, e, em seguida, o resultado do operador gradiente e seu histograma. Esta técnica realça melhor as bordas da imagem.

Tópico 20 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a técnica Crescimento de Regiões (Region Growing). Para isto, inicialmente faça uma imagem com dimensões 320×240 no paint, onde o fundo da imagem seja branco e exista um círculo preto no centro. Utilize algum ponto dentro do circulo preto como semente, onde você deve determinar este ponto analisando imagem previamente. A regra de adesão do método deve ser: “Sempre que um vizinho da região possuir tom de cinza menor que 127, deve-se agregar este vizinho à região”. Aplique o Crescimento de Regiões de forma iterativa, em que o algoritmo irá estabilizar apenas quando a região parar de crescer.

Tópico 21 – Faça o mesmo que o tópico 21, alterando apenas o modo de inicializar a semente, onde esta deve ser inicializada com um click na imagem apresentada pela OpenCv.

Tópico 22 – Faça o mesmo que o tópico 22, calculando no final o centroide do objeto segmentado pelo método Crescimento de Regiões 3D, apresentando a região segmentada em azul e o centroide em verde.

Tópico 23 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a técnica Crescimento de Regiões (Region Growing). Para isto, pegue uma imagem qualquer real, com tanto que a mesma possua um objeto se destaque do fundo. Inicialize a semente com um clique neste objeto, conforme o Tópico 21 e encontre uma regra de adesão que seja capaz de segmentar este objeto. Aplique o Crescimento de Regiões de forma iterativa, em que o algoritmo irá estabilizar apenas quando a região parar de crescer.

Tópico 24 – Abrir uma imagem colorida e aplique a técnica Crescimento de Regiões (Region Growing). Para isto, pegue uma imagem qualquer real, com tanto que a mesma possua um objeto se destaque do fundo. Inicialize a semente com um clique neste objeto, conforme o Tópico 21 e encontre uma regra de adesão que seja capaz de segmentar este objeto. Aplique o Crescimento de Regiões de forma iterativa, em que o algoritmo irá estabilizar apenas quando a região parar de crescer. Este tópico diferencia-se do Tópico 23 por ser necessário encontrar uma regra que utilize os canais R, G e B simultanemante.

Tópico 25 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a técnica Crescimento de Regiões (Region Growing). Para isto, faça no paint uma imagem 640×480 com alguns objetos em preto e o fundo seja branco. Neste tópico irão existir mais de um objeto para segmentar, então existe mais de uma região. Inicialize a semente com um clique em cada objeto, em que o primeiro clique rotule o objeto como região 1, pintando a região encontrada de vermelho. Ao terminar de delimitar a região 2, clique em outro objeto, rotulando esta região como 2 e pinte esta região de azul. Faça o mesmo para um terceiro objeto, pintando o mesmo de verde e rotulando sua região como 3. Obs: Ressalto que as regiões que não fazem parte de nenhum objeto devem possuir valor 0.

Tópico 26 – Faça o mesmo que a questão 25, entretanto apenas forneça a imagem de entrada, detecte quantos objetos existem de forma automática, rotulando cada região de forma automática, e no final apresente cada objeto encontrado por uma cor distinta.

Tópico 27 – Faça o mesmo que a questão 26, entretanto gere subimagens com os objetos detectados e apresente estas subimagens, uma em cada janela. Obs: Perguntem para o Samuel, ele já sabe.

Tópico 28 – Abrir uma imagem colorida, transformar para tom de cinza e aplique e aplique a limiarização automática da própria Opencv, para que o limiar não dependa da aplicação e nem da luminosidade do local.

Tópico 29 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a transformada de hough para detectar bordas. Faça um desenho no paint que contenha diversos objetos, inclusive um círculo e apenas o círculo deve ser detectado. Obs: Perguntem para o Samuel, ele está trabalhando com isto.

As questões abaixo são sobre o uso da função “cvFindContours”, e devem ser feitas em sequência.

Tópico 30 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a transformada de canny para detectar bordas. Apliquem o método cvFindContours para determinar quantos contornos existem na imagem. Apresentem o resultado obtido e a imagem de entrada. O retorno deve ser a mesma quantidade de objetos existentes.

Tópico 31 – Após fazer a questão 30, destaque cada objeto encontrado desenhando um retângulo indicando onde os mesmos se encontram. Utilizar a função “cvContourBoundingRect” para determinar cada contorno. Ressalto que é necessário percorrer os contornos encontrados na função “cvFindContours” de forma correta.

Tópico 32 – Após fazer a questão 31, calcule a área de cada contorno obtido através da função “cvContourArea”, apresentando seu valor.

Tópico 33 – Após fazer a questão 31, gere uma subimagem utilizando o retângulo encontrado para cada objeto ou contorno encontrado.

Tópico 34 – Verificar se está ocorrendo acumulo de memória a cada iteração, aprendendo a apagar cada objeto criado quando não usar mais os mesmos.

As questões abaixo são sobre o uso das funções “cvDilate” e “cvErode”, e devem ser feitas em sequência.

Tópico 35 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a limiarização de otsu. Apliquem o método cvDilate de forma iterativa, apresentando o resultado de cada iteração, verificando o que o método causa. O resultado deve ser aumentar as regiões brancas, então se o objeto for branco este método aumentará o objeto.

Tópico 36 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a limiarização de otsu. Apliquem o método cvErode de forma iterativa, apresentando o resultado de cada iteração, verificando o que o método causa. O resultado deve ser diminuir as regiões brancas, então se o objeto for branco este método diminuirá o objeto.

Tópico 37 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a limiarização de otsu. Apliquem o método cvDilate de forma iterativa, apresentando o resultado de cada iteração, verificando o que o método causa. Utilize um elemento estruturante com uma linha e três colunas, com a referencia no centro, então o objeto deve crescer apenas na vertical, pois o elemento estruturante é vertical. O objeto deve ser branco e o fundo preto.

Tópico 38 – Faça o mesmo que a questão 37, alterando o elemento estruturante e sua referência e verifique o que acontece.

Tópico 39 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a limiarização de otsu. Apliquem o método cvErode de forma iterativa, apresentando o resultado de cada iteração, verificando o que o método causa. Utilize um elemento estruturante com uma linha e três colunas, com a referencia no centro, então o objeto deve diminuir apenas na vertical, pois o elemento estruturante é vertical. O objeto deve ser branco e o fundo preto.

Tópico 40 – Faça o mesmo que a questão 39, alterando o elemento estruturante e sua referência e verifique o que acontece.

As questões abaixo são sobre o uso da biblioteca “blob”.

Tutorial de Instalação e Configuração dos Blobs – download.

Tópico 41 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a transformada de canny para detectar bordas. Apliquem a biblioteca “blob” para determinar quantos contornos existem na imagem. Apresentem o resultado obtido e a imagem de entrada. O retorno deve ser a mesma quantidade de objetos existentes.

Tópico 42 – Abrir uma imagem colorida, transformar para tom de cinza e aplique a transformada de canny para detectar bordas. Apliquem a biblioteca “blob” para determinar quantos contornos existem na imagem. Apresentem o resultado obtido e a imagem de entrada. O retorno deve ser a mesma quantidade de objetos existentes.

Tópico 43 – Após fazer a questão 42, apresentem cada objeto na imagem, pintando o mesmo ou apresentando quadrados ao seus redor, ou ambos.

Tópico 44 – Após fazer a questão 42, gerem subimagens com cada objeto encontrado.

Tópico 45 – Após fazer a questão 42, apliquem filtros de altura, largura e área para selecionar apenas os contronos que desejam. Apliquem outros filtros para ver o que acontece. Peçam para imprimir os valor encontrados que dá pra ter uma noção melhor dos valores que devem ser usados nos filtros.

Arquivo PDF do treinamento básico de PDI com OpenCv usando C++ – Download.

As questões abaixo são sobre extração de atributos

Tópico 46 – Abrir uma sequência de imagens coloridas, transformar para tom de cinza cada image e obtenha os momentos estatísticos de todas estas imagens. Imprima os resultados de cada imagem em um arquivo e na tela do prompt de comandos. Cada linha do arquivo gerado deve representar os atributos obtidos em uma imagem.

Tópico 47 – Abrir uma sequência de imagens coloridas, transformar para tom de cinza cada image e obtenha os momentos centrais de todas estas imagens. Imprima os resultados de cada imagem em um arquivo e na tela do prompt de comandos. Cada linha do arquivo gerado deve representar os atributos obtidos em uma imagem.

Tópico 48 – Abrir uma sequência de imagens coloridas, transformar para tom de cinza cada image e obtenha os momentos de HU (também conhecidos como momentos invariantes) de todas estas imagens. Imprima os resultados de cada imagem em um arquivo e na tela do prompt de comandos. Cada linha do arquivo gerado deve representar os atributos obtidos em uma imagem.

Tópico 49 – Abrir uma sequência de imagens coloridas, transformar para tom de cinza cada image e obtenha os Local Binary Pattern (LBP) de todas estas imagens. Imprima os resultados de cada imagem em um arquivo e na tela do prompt de comandos. Cada linha do arquivo gerado deve representar os atributos obtidos em uma imagem.

Tópico 50 – Abrir uma sequência de imagens coloridas, transformar para tom de cinza cada image e obtenha as Texturas de Haralick que são calculadas à partir da matriz de co-ocorrência (GLCM em inglês) de todas estas imagens. Imprima os resultados de cada imagem em um arquivo e na tela do prompt de comandos. Cada linha do arquivo gerado deve representar os atributos obtidos em uma imagem.

Tópico 51 – Utilizar o método Scale Invariant Feature Transform (SIFT) para detectar onde está um objeto conhecido à priori em uma imagem através dos keypoints detectados por este método. Desenhar os keypoints em comum e marcar o objeto procurado na imagem.

Tópico 52 – Utilizar o método Speeded Up Robust Features (SURF) para detectar onde está um objeto conhecido à priori em uma imagem através dos keypoints detectados por este método. Desenhar os keypoints em comum e marcar o objeto procurado na imagem.

As questões abaixo são sobre Classificação através de métodos de Machine Learning (Aprendizado de Máquina)

Tópico 53 – Implementar o método de classificação do vizinho mais próximo (KNN em inglês) usando os métodos Hold out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv. Deve ser implementado o KNN com o K igual a 1, 3 e 7. Obs: Não usar as classes de Machine Learning da OpenCv.

Tópico 54 – Implementar o método de classificação k-médias (K-means em inglês) usando os métodos Hold out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv. Deve ser implementado o KNN com o K igual a 1, 3 e 7. Obs: Não usar as classes de Machine Learning da OpenCv.

Tópico 55 – Usar o método de classificação pelo vizinho mais próximo (KNN em inglês) usando a biblioteca de Machine Learning da OpenCv. Deve-se fazer com os métodos Hold Out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv.

Tópico 56 – Usar o método de classificação Multi Layer Perceptron (MLP) usando a biblioteca de Machine Learning da OpenCv. Deve-se fazer com os métodos Hold Out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv. Faça os testes com no mínimo três topologias distintas da Rede Neural usada.

Tópico 57 – Usar o método de classificação do Support Vector Machine (SVM) usando a biblioteca de Machine Learning da OpenCv. Deve-se fazer com os métodos Hold Out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv. Faça os testes do SVM com os Kernels Linear, polinomial, Sigmoidal e RBF.

Tópico 58 – Usar o método de classificação de Bayes usando a biblioteca de Machine Learning da OpenCv. Deve-se fazer com os métodos Hold Out e Leave One Out. Tudo deve ser feito utilizando a estrutura Mat da OpenCv.

Tópico 59 – Faça a matriz de confusão para as questões de 53 a 58.

Tópico 60 – Calcule a acurácia, a especificidade e a sensibilidade a partir de cada matriz de confusão obtida na questão 59.

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s