domingo, 19 de janeiro de 2014

Operador Morfológico: Dilatação

Operadores morfológicos processam imagens com base em formas. Operações morfológicas aplicam um elemento estruturante em uma imagem de entrada e geram uma imagem de saída. Os operadores morfológicos mais básicos são: Erosão e Dilatação.
Dentre as suas principais aplicações encontram-se:
  • Remoção de ruído;
  • Isolamento de elementos individuais
  • Juntar elementos díspares em uma imagem;
  • Descoberta de colisões de intensidade e/ou buracos em uma imagem.
Dilatação: Esta operação consiste em uma convolução de uma imagem A com algum kernel/máscara (B), que pode ter qualquer forma ou tamanho, geralmente formas quadrada ou circulares. O kernel/máscara (B) tem um ponto de ancoragem definido, geralmente o centro do próprio kernel/máscara. Isto faz com que as regiões brilhantes (claras) da imagem cresçam, ficando em evidência, criando um efeito de máximo local. Observer a imagem original e as duas seguintes são os resultados da aplicação do operador morfológico de dilatação com os valores de entrada para a máscara de 1 e 2, respectivamente.

Imagem original - Modelo Lenna Söderberg

Imagem resultante do operador de dilatação com entrada igual à 1.
Imagem resultante do operador de dilatação com entrada igual à 2.

Imagem resultante do operador de dilatação com entrada igual à 3.
Observa-se que quanto maior o valor de entrada para o kernel (encontrado na literatura também como template ou máscara) maior será a dilatação das áreas mais claras da imagem. Em linguagem C está o código a seguir para a versão 2.4 do OpenCV:

#include <opencv/cv.h>
#include <opencv/highgui.h>
void dilate(IplImage *original) {
IplImage *imgDilatada = cvCloneImage(original);
cvDilate(original, imgDilatada, NULL, 3); //Aqui se define o valor para a máscara 1, 2, 3...
cvSaveImage("./src/filtered/Lenna_Söderberg_Dilatada_3.jpg", imgDilatada, 0);
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
cvShowImage("Original", original);
cvNamedWindow("Filtrada", CV_WINDOW_AUTOSIZE);
cvShowImage("Filtrada", imgDilatada);
cvWaitKey(0);
cvDestroyWindow("Original");
cvDestroyWindow("Filtrada");
cvReleaseImage(&original);
cvReleaseImage(&imgDilatada);
}
int main() {
IplImage *original;
original = cvLoadImage("./src/pictures/Lenna_Söderberg.png", -1);
dilate(original);
return 0;
}

No próximo post, demonstraremos a aplicação do operador morfológico de erosão. 

segunda-feira, 16 de maio de 2011

Filtro Gaussiano

O filtro de gaussiano possibilita a redução de ruídos na imagem através do cálculo da distribuição normal (gauss ou gaussiana) dos números correspondentes aos pixels da máscara utilizada. No OpenCV as máscaras, para a correta utilização do filtro, devem ser MxN, onde M e N sejam números ímpares, podendo ser M = N. A seguir encontram-se quatro imagens: a primeira é uma imagem na forma original de captura, a segunda é o resultado da aplicação do filtro gaussiano com máscara 3x3, a terceira é o resultado da aplicação de uma máscara 5x5 e por fim uma imagem resultante da aplicação do filtro gaussiano com máscara 7x7.

Imagem original - Modelo Lenna Söderberg

Imagem após a aplicação do filtro de mediana com máscara de 3 x 3
Imagem após a aplicação do filtro de mediana com máscara de 5 x 5
Imagem após a aplicação do filtro gaussiano com máscara de 7 x 7


Em linguagem C está o código-fonte utilizado para gerar a última imagem (com máscara de 7x7) a seguir. Perceba, através da primeira linha de código, que utilizamos a biblioteca OpenCV, a qual deve ser instalada e  configurada para reproduzir o resultado do algoritmo.
#include <cv.h>
#include <highgui.h>

int main(int argc, char *argv[])
{
IplImage *original;
original = cvLoadImage("Lenna_Söderberg.png", -1);
IplImage *imgFiltroGaussiana = cvClone(original);
cvSmooth(original, imgFiltroGaussiana, CV_GAUSSIAN, 7, 7, 0, 0);
cvSaveImage("Lenna_Söderberg_Gaussiana_7x7.jpg",imgFiltroGaussiana, 0);
cvNamedWindow("Original",CV_WINDOW_AUTOSIZE);
cvShowImage( "Original", original);
cvNamedWindow("Filtro de Gaussiana",CV_WINDOW_AUTOSIZE);
cvShowImage( "Filtro de Gaussiana", imgFiltroGaussiana);
cvWaitKey(0);
cvDestroyWindow("Original");
cvDestroyWindow("Filtro de Gaussiana");
cvReleaseImage(&original);
cvReleaseImage(&imgFiltroGaussiana);
return 0;
}

No próximo post, demonstraremos a aplicação do operador morfológico de dilatação.

domingo, 15 de maio de 2011

Filtro de Mediana

O filtro de mediana possibilita a redução de ruídos na imagem através do cálculo da mediana dos números correspondentes aos pixels da máscara utilizada. No OpenCV as máscaras, para a correta utilização do filtro, devem ser MxN, onde M e N sejam números ímpares, podendo ser M = N. A seguir encontram-se quatro imagens: a primeira é uma imagem na forma original de captura, a segunda é o resultado da aplicação do filtro de mediana com máscara 3x3, a terceira é o resultado da aplicação de uma máscara 5x5 e por fim uma imagem resultante da aplicação do filtro de mediana com máscara 7x7.

Imagem original - Modelo Lenna Söderberg
Imagem após a aplicação do filtro de mediana com máscara de 3 x 3

Imagem após a aplicação do filtro de mediana com máscara de 5 x 5

Imagem após a aplicação do filtro de mediana com máscara de 7 x 7

Em linguagem C está o código-fonte utilizado para gerar a última imagem (com máscara de 7x7) a seguir. Perceba, através da primeira linha de código, que utilizamos a biblioteca OpenCV, a qual deve ser instalada e  configurada para reproduzir o resultado do algoritmo.
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
IplImage *temp;
temp = cvLoadImage("Lenna_Söderberg.png", -1);
IplImage *imgFiltroMediana = cvClone(temp);
cvSmooth( temp, imgFiltroMediana, CV_MEDIAN, 7, 7, 0, 0);
cvSaveImage("Lenna_Söderberg_Mediana_7x7.jpg",imgFiltroMediana, 0);
cvNamedWindow("Original",CV_WINDOW_AUTOSIZE);
cvShowImage( "Original", temp);
cvNamedWindow("Filtro de Mediana",CV_WINDOW_AUTOSIZE);
cvShowImage( "Filtro de Mediana", imgFiltroMediana);
cvWaitKey(0);
cvDestroyWindow("Original");
cvDestroyWindow("Filtro de Mediana");
cvReleaseImage(&temp);
cvReleaseImage(&imgFiltroMediana);
return 0;
}



No próximo post, demonstraremos a aplicação de um Filtro Gaussiano.


Até breve.

segunda-feira, 11 de abril de 2011

Filtro de Média

O filtro de média possibilita a redução de ruídos na imagem através do cálculo da média dos números correspondentes aos pixels da máscara utilizada. No OpenCV as máscaras, para a correta utilização do filtro, devem ser MxN, onde M e N sejam números ímpares, podendo ser M = N. A seguir encontram-se quatro imagens: a primeira é uma imagem na forma original de captura, a segunda é o resultado da aplicação do filtro de média com máscara 3x3, a terceira é o resultado da aplicação de uma máscara 5x5 e por fim uma imagem resultante da aplicação do filtro de média com máscara 7x7.

Imagem original - Modelo Lenna Söderberg

Imagem após a aplicação do filtro de média com máscara de 3 x 3

Imagem após a aplicação do filtro de média com máscara de 5 x 5

Imagem após a aplicação do filtro de média com máscara de 7 x 7
Em linguagem C está o código-fonte utilizado para gerar a última imagem (com máscara de 7x7) a seguir. Perceba, através da primeira linha de código, que utilizamos a biblioteca OpenCV, a qual deve ser instalada e  configurada para reproduzir o resultado do algoritmo.
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[]){
IplImage *imgOriginal;
imgOriginal = cvLoadImage("tabuleiro_2011-04-12.jpg", -1);
IplImage *imgFiltroMedia = cvClone(imgOriginal);
cvSmooth( imgOriginal, imgFiltroMedia, CV_BLUR, 7, 7, 0, 0); cvSaveImage("tabuleiro_2011-04-12_7x7.jpg",imgFiltroMedia, 0);
cvNamedWindow("Original",CV_WINDOW_AUTOSIZE); cvShowImage( "Original", imgOriginal); cvNamedWindow("Filtro de Media",CV_WINDOW_AUTOSIZE); cvShowImage( "Filtro de Media", imgFiltroMedia); cvWaitKey(0);
cvDestroyWindow("Original Lena"); cvDestroyWindow("Filtro de Media");
cvReleaseImage(&imgOriginal); cvReleaseImage(&imgFiltroMedia);
return 0;


No próximo post, demonstraremos a aplicação de um Filtro de Mediana.


Até breve.

sexta-feira, 24 de setembro de 2010

Pré-processamento - Por que utilizar filtros?

O objetivo de utilizar filtro é diminuir os ruídos da imagem, facilitando o encontro de objetos. Consideramos ruídos como imperfeições que surgem na captura da imagem e que não são importantes para o  seu processamento. Normalmente o filtro é utilizado durante o pré-processamento da imagem, atualmente o Projeto SHIVA utiliza como fase de pré-processamento a binarização de imagem, ou seja, a transformação da imagem captura em preto ou branco. Dependendo do ambiente (Figura 1) em que o SHIVA esteja preparado para ser usado, alguns ruídos aparecem decorrentes da iluminação local ou reflexos.
Figura 1: Ambiente do Projeto SHIVA
A binarização da imagem gera alguns ruídos atualmente resolvemos utilizando o aumento ou a diminuição das cores primárias: vermelha, verde e azul - também conhecidas como Padrão RGB (Red, Green, Blue). Um problema dessa diminuição ou aumento das cores é que eles são válidos para os objetos que aparecem no decorrer da utilização do SHIVA. A iteração homem-computador é feita por meio de um laser que gera um ponto no layout impresso e também sofre modificações com essa alteração na escala das cores primárias. O objetivo seria utilizar filtros na fase de pré-processamento para que a projeção do laser no layout não seja modificada de acordo com a modificação das cores.

Tipos de Filtros
Os filtros são freqüentemente classificados como filtro passa-baixa, filtro passa-alta, filtro passa-banda, filtro de média, filtro de mediana, dentre outros. Na próxima postagem detalharemos um desses tipos de filtro, aquele que melhor atender as necessidades do projeto, citadas até aqui. Mostraremos também o código em C++, utilizando algumas funções da biblioteca OpenCV. Esse biblioteca utiliza máscaras para aplicar os filtros nas imagens. Por exemplo, uma máscara 3x3:


Máscara 3x3
Onde o número que ocupa a posição em destaque poderia ser substituído pela média dos pixels que os cercam. Esse processo se repete até que a máscara passe por toda a imagem e no final gere um novo arquivo com o resultado dessa filtragem, uma imagem com redução de ruídos. No próximo post, demonstraremos a aplicação de um filtro de média em uma imagem qualquer.






Até breve.

quarta-feira, 15 de setembro de 2010

Blog de pesquisas relacionadas ao Projeto SHIVA


Este blog reunirá informações sobre pesquisas que poderão ser utilizadas no Projeto SHIVA, seja na captura ou tratamento de imagens, ajustes finos e outros.
Abrimos este espaço para criar um diário de pesquisa que permita socializar os nossos conhecimentos com pessoas que também tenham interesses em áreas como realidade aumentada, processamento de imagem e infoinclusão.

Enfim, vamos pesquisar!