Imagens binárias II

Neste artigo iremos implementar alguns dos algoritmos apresentados anteriormente com as ferramentas que instalamos em outros posts para processamento de imagens binárias.
imagens binárias Processamento de Imagens
Este post faz parte da série Imagens Binárias. Leia também os outros posts da série:

Introdução

Dando continuidade à primeira parte desta série, iremos implementar alguns dos algoritmos apresentados anteriormente com as ferramentas que instalamos em outros posts.

Algoritmo 1: Threshold 

Para implementar esse algoritmo, usaremos o opencv com QT. Consulte esse artigo para criar um novo projeto e adicione o seguinte código:

Nota-se uma enorme facilidade de se implementar esse algoritmo no OpenCV. Como visto no primeiro post, para se converter uma imagem colorida em binária é necessário convertê-la para tons de cinza. Isso é feito já na leitura da imagem na linha 13, com o parâmetro IMREAD_GRAYSCALE da função im_read. Todo o trabalho de binarização da imagem é feito em apenas uma linha de código como se vê na linha 23. O resultado desta técnica é a foto abaixo.

opencv_bin

Figura 1
 

Por ser tão simples, mostrarei como seria feito no SimpleCV. No script digite:

Tudo é feito na primeira linha de código. Lê-se o arquivo, converte para escala de cinza, converte a imagem para binário com o limite de 128. A função invert() serve para inverter pixels 1 para 0 e 0 para 1. Depois exibe e salva a imagem. O resultado é a imagem abaixo. Vale mencionar que as imagens geradas pelo OpenCV e SimpleCV, apesar de muito parecidas, não são iguais.

simplecv_lena_threshold

Figura 2

Algoritmo 2: Ordered dithering

Este algoritmo será implementado usando-se a ferramenta octave. O código fonte é o seguinte:

No algoritmo acima, usamos uma matriz de bayer 8×8. Replicamos essa matriz ao mesmo tamanho da imagem que queremos processar. Depois comparamos pixel a pixel e atribuímos valores de acordo com o algoritmo, 1 onde o pixel da imagem original é maior que o pixel da matriz de bayer e 0 em todos os outros. O resultado é a imagem abaixo.

octave_lena

Figura 3

 

Algoritmo 3: Error difusion

Para esta última técnica usaremos o Octave e OpenCV. A implementação no Octave está apresentada a seguir.

A imagem gerada pelo código acima é apresentada na figura 4.

floyd_octave

Figura 4

E esta é a implementação no OpenCV:

A imagem gerada está representada na figura 5 abaixo.

opencv_floyd

Figura 5

Neste algoritmo, como comentado no post anterior [1], possui uma complexidade maior e por isso um tempo de processamento superior. Primeiro, converte-se o arquivo RGB em tons de cinza. Depois é necessário varrer toda a imagem, e a cada iteração, recalcula-se e acumula-se o erro. Caso o valor do pixel seja acima de 128, atribui-se 255, caso contrário 0. Deve-se destacar que o tempo de processamento no OpenCV é muito menor que no Octave.

Conclusão

Atualmente existem diversas ferramentas para processamento de imagem que são muito robustas e simples. Nos exemplos deste post, nota-se a extrema facilidade de se implementar alguns algoritmos de binarização. O reuso de bibliotecas nos permite aprimorar os algoritmos, deixando-os mais rápidos, robustos e simples de serem usados. Porém deve-se tomar o cuidado de não apenas usar as funções, mas sim entender a teoria por trás dos algoritmos.

Referências

Outros artigos da série

<< Imagens binárias

Engenheiro eletrônico com 10 anos de experiência em sistemas embarcados, pós graduado em redes de computadores e atualmente cursando mestrado em sistemas de visão por computador na universidade Laval no Canadá. Compartilha seu conhecimento neste portal quando tem tempo livre e quando não está curtindo a vida com sua mulher e os 3 filhos.

Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H