Home Artigos Programação Software Para Processamento Digital de Sinais/Imagens
Software Para Processamento Digital de Sinais/Imagens Imprimir E-mail
Qua, 30 de Setembro de 2009 13:26

2. Materiais e Métodos

2.1 Detalhes de linguagem

Em MATLAB as imagens são representadas como três matrizes de inteiros, que correspondem às três bandas de cores. Tal representação é de uso comum na linguagem e possui fácil manipulação e acesso via operadores da linguagem.

Em Java as imagens são representadas por objetos da classe BufferedImage, do pacote java.awt.image. Estas são tratadas como uma matriz de inteiros de quatro bytes, sendo três bytes usados para representar as bandas R, G e B, que podem ser separadas de acordo com o exemplo abaixo:

int pixel = imagem.getRGB(linha, coluna);

int bandaR = (pixel >> 16) & 255;

int bandaG = (pixel >> 8) & 255;

int bandaB = (pixel >> 0) & 255;.

2.2 Metodologia de implementação dos filtros

2.2.1 Transformação RGB YUV

Para esta operação foi utilizado o sistema linear apresentado na introdução:

Onde; R, G e B são os valores de cada pixel, Y’= [0,1], U=[-0.436,0.436]  e U=[-0.615,0.615].

2.2.2 Transformação YUV RGB

Para esta operação foi utilizado o sistema linear apresentado na introdução:

onde Y, U e V são os valores de cada pixel.

2.2.3 Negativo para RGB e YUV

A operação negativo nas bandas R, G e B de uma imagem consiste em inverter as suas cores, provocando alterações intensas de matizes, com a substituição das cores por suas complementares (verde/magenta, azul/amarelo, vermelho/cíano, branco/preto). A simples operação do negativo às vezes permite a observação de forma mais clara de algumas estruturas da imagem. Ela se dá da seguinte forma:

Negativo RGB

R' = 255 – R

G' = 255 – G

B' = 255 – B

Já para o formato YUV, a subtração é realizada apenas na banda Y. As alterações são feitas apenas nas intensidades das cores como, por exemplo, de vermelho escuro para vermelho claro ou vice e versa:

Negativo YUV

Y' = 255 - Y

Se fizer-se, após a aplicação do negativo na banda Y, uma conversão para o sistema RGB original, as matizes serão perfeitamente preservadas.

Brilho Aditivo e Multiplicativo para RGB e YUV

Aumentar o brilho de uma imagem consiste em incrementar a intensidade luminosa de cada pixel. Para uma imagem no sistema RGB, aumenta-se um valor constante em cada banda R, G ou B, somando (efeito aditivo) ou multiplicando (efeito multiplicativo) a uma constante c, ou seja:

Aditivo RGB

Multiplicativo RGB

R’ = R + c

G’ = G + c

B’ = B + c

R’ = R * c

G’ = G * c

B’ = B * c

Para uma imagem no sistema YUV é utilizada a mesma idéia, sendo que a operação só é realizada para a banda Y, ou seja:

Aditivo YUV

Multiplicativo YUV

Y' = R + c

Y' = R * c

Essa operação requer que alguns limites sejam analisados, pois os valores de cada banda variam entre 0 e 255 e não podem ultrapassar estes.

Separar bandas R, G e B em imagens monocromáticas e coloridas.

As imagens usadas estão representadas no formato RGB, sendo assim constituídas da superposição de três bandas, cada qual com uma tonalidade de R, G e B, respectivamente.

A separação destas bandas é alcançada pela captura do pixel que, na representação em tipo Integer da linguagem Java, possui 4bytes, sendo o primeiro byte reservado para transparência e os 3 bytes seguintes para as bandas RGB. Uma vez capturado o pixel, faz-se um deslocamento dos bytes(16, 8 ou 0 bits para R, G e B, respecticamente) e uma operação lógica E com a mascara 255. O resultado desta operação retornará a contribuição daquela banda para o pixel. Um exemplo pode ser visto abaixo:

Separação das bandas R, G e B de um pixel, usando linguagem Java:

int bandaR = (pixel >> 16) & 255;

int bandaG = (pixel >> 8) & 255;

int bandaB = (pixel) & 255;

Uma vez separado o pixel nas três bandas, pode-se fazer o processo de deslocamento inverso para atribuí-las de volta ao pixel original. É nesta etapa que faz-se a separação, atrinbuindo de volta ao pixel apenas a contribuição de uma das bandas e zerando o valor das demais, conforme exemplo abaixo:

Atribuição apenas da banda R a um pixel, usando linguagem Java:

pixel = (bandaR << 16) | 0 | 0;

Por fim, atribui-se o pixel de volta a imagem, obtendo uma imagem formada pela contribuição de apenas uma banda e com as demais “zeradas”, causando um efeito avermelhado, verde ou azulado, conforme a banda escolhida.

Para fazer a separação em imagem monocromática, faz-se o mesmo procedimento anterior, porém, ao atribuir o valor da banda de volta ao pixel, atribui-se este valor aos três bytes, conforme exemplo abaixo:

Atribuição apenas da banda R a um pixel, como imagem monocromática, usando linguagem Java:

pixel = (bandaR << 16) | (bandaR << 8) | bandaR;

O processo é análogo para as demais bandas.

Média para RGB e YUV

O valor do pixel resultante é igual média dos valores dos pixels originais em uma vizinhança n x n.

Este é um filtro simples e usado freqüentemente para suavizar imagens, com conseqüente redução de alguns ruídos. Sua operação sobre um pixel é a média aritmética desde pixel e sua vizinhança, que pode variar como uma seqüência de números imparem, como 3x3, 5x5, 11x11 e etc. A tabela abaixo ilustra esta operação:

P

P

P

P

A

P

P

P

P/W

W

W

W

W

W

W

W

W

W

W

W

B

W

W

W

W

W

W

W

W

W

W

W

W

Na tabela acima, para calcular-se a média do pixel A, em uma vizinhança 3x3, deve-se efetuar a média aritmética dos pixels marcados como P com o pixel A, ou seja:

Média em A = P+P+P+P+P+P+P+P+A / 9. O valor resultante é, por fim, atribuído ao pixel A e o processo continua com o próximo pixel.

Para uma vizinhança maior, o processo é análogo, conforme visto para o pixel B em vizinhança 5x5.

Ressalta-se que quanto maior for a vizinhança, maior a percepção do feito e, também, o tempo requerido para o processamento.

Detalhes de implementação em linguagem Java podem ser encontrados nos anexos.

Mediana para RGB e YUV

A operação de mediana é, assim como a média, freqüentemente utilizada para remoção de ruídos, neste caso, principalmente ruído do tipo aleatório, além de causar um efeito de “desenho” na imagem final. Sua implementação consiste em ordenar o pixel e sua vizinhança em um vetor e encontrar o elemento central, ou seja, o elemento mediano. A tabela abaixo ilustra este processo:

1

5

3

7

6

9

8

5

4

W

W

W

W

W

W

W

W

W

W

W

B

W

W

W

W

W

W

W

W

W

W

W

W

Para calcular a mediana do pixel 6, ordena-se sua vizinhança em um vetor e substitui-se o pixel 6 pelo pixel encontrado no meio do vetor, ou seja, vetor[length/2], onde length é o tamanho do vetor, como a seguir:

Vetor = { 1, 3, 4, 5, 5, 6, 7, 8, 9 };

Vetor[length/2] = 5;

Assim, o valor final do pixel 6 será 5, sua mediana. O processo é análogo para vizinhança maior e continua até varrer todos os pixels da imagem.



Comentários
Pesquisar
Somente usuários registrados podem escrever comentários!

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."

 
João F. M. Figueiredo, Creative Commons License
Todo conteúdo, exceto onde indicado ao contrário, está licenciada sob uma Licença Creative Commons.