Processamento
Digital de Imagens
Filtragens Espaciais
Nesta aula abordaremos os principais
conceitos relacionados à aplicação de filtros
espaciais, em imagens digitais, e suas aplicaçoes
Importante: O resumo abaixo deve ser complementado,
pelo aluno, com a leitura dos textos sugeridos na bibliografia do curso.
Tópicos
Introdução - Conceitos iniciais
- A filtragem
aplicada a uma imagem digital
é uma operação local que modifica os valores dos
níveis digitais de cada pixel da imagem considerando o contexto
atual do pixel.
- Pela filtragem, o
valor de cada pixel da imagem é modificado
utilizando-se uma operação de vizinhança, ou seja,
uma operação que leva em conta os níveis digitais
dos pixels vizinhos e o próprio valor digital do pixel
considerado.
- A figura abaixo ilustra o conceito de operadores de
vizinhança.
Figura: Ilustração
do conceito de operações de
vizinhança aplicadas em imagens digitais.
-
Nas nossas
definições de vizinhança começamos por
considerar que: um
pixel qualquer da imagem digital é vizinho dele mesmo.
- Como vizinhança 4
de um pixel considera-se, além do próprio pixel, os
pixels mais próximos nas direções vertical e
horizontal em relação a esse pixel.
-
Como vizinhança 8
de um pixel
considera-se, além do próprio pixel, a vizinhança
4 e também os pixels mais próximos nas
direções diagonais em relação a esse pixel.
-
A Figura abaixo ilustra os
conceitos acima. Na figura o pixel marcado em vermelho é nossa
referência.
|
X
|
|
|
X |
X
|
X |
X
|
X
|
X
|
X |
X
|
X |
|
X
|
|
X |
X |
X |
(a)
(b)
Figura: Vizinhanças (a) 4 e (b)
8 em uma imagem digital
.
- Importante: Na figura acima mostrou-se a vizinhança de
janelas 3x3
de uma imagem digital. Podemos trabalhar com janelas maiores, 5x5, 7x7,
etc... quando queremos que a filtragem utilize valores
digitais vizinhos mais distantes de cada pixel.
- Objetivos da filtragem de uma imagem digital
- Entre os objetivos de utilização de filtros em
imagens digitais podemos citar:
- homogeneização da imagem ou de alvos
específicos
- extração de ruídos da imagem
- simulação de imagens com
resoluções radiométricas menores
- melhora na discriminação de alvos da imagem
- detecção de bordas entre alvos distintos
presentes na imagem
- detecção de formas, etc....
- Idéia básica da filtragem digital
-
No processo de filtragem digital utiliza-se uma
operação de convolução de uma
máscara pela imagem digital. Isso equivale a uma
operação que "passeia" sobre toda imagem original
modificando seus valores de acôrdo com os valores da imagem
originais e os pesos da máscara.
-
A máscara utilizada é também uma imagem,
em geral quadrada, menor que a imagem
original. Os valores da imagem máscara são
utilizados como
pesos a serem aplicados sobre os níveis digitais dos pixels da
imagem original
Figura: Ilustração do procedimento de
convolução de uma máscara de pesos sobre uma
imagem digital (figura adaptada de:
http://www.dpi.inpe.br/cursos/pdi/pdi5-realce_arquivos/frame.htm )
- Na ilustração da figura acima, a máscara
é aplicada sobre a área equivalente da imagem original
e o resultado será a atribuição de um novo valor
digital para o pixel central (marcado com X).
- Os pesos das máscaras podem ser valores positivos,
negativos ou zero. Um elemento da máscara com peso zero
representa a não consideração do respectivo nivel
digital da imagem original.
- O procedimento de convolução
-
A convolução da máscara de pesos pela
imagem é um processo de aplicação dessa
máscara a todos os pixels da imagem digital.
-
No processo de convolução o novo valor do
nível digital do pixel marcado com X (mostrado na figura acima)
é calculado pela somatória dos valores digitais dos
pixels vizinhos, ponderados pelos respectivos pesos da
máscara. A formulação matemática geral,
para a convolução de uma máscara 3x3 sobre um
pixel qualquer, p[i,j], da imagem digital, é dada por:
p[i,j] = a*p[i-1,j-1] + b*p[i-1, j ] + c*p[i-1,j+1] +
d*p[ i ,j-1] + e*p[ i , j ] +
f*p[ i ,j+1] +
g*p[i+1,j-1] + h*p[i+1, j ] + i*p[i+1,j+1]
- Por exemplo, se considerarmos os pixels iniciais de uma imagem
digital, o valor digital do pixel X, representado aqui por p[1,1],
é calculado pela seguinte formulação:
p[1,1] = a*p[0,0] + b*p[0,1] + c*p[0,2] +
d*p[1,0] + e*p[1,1] + f*p[1,2] +
g*p[2,0] + h*p[2,1] + i*p[2,2]
-
Após o cálculo do valor de X, o cálculo
é repetido com a máscara deslocada 1
pixel para a direita, e depois mais1 pixel para a direita, e assim por
diante até encontrar a última coluna da imagem. Depois
desloca-se a
máscara para o início da próxima linha e repete-se
todo o processo até que se alcançe o final da imagem.
-
Observe que os valores digitais da borda da imagem original
não são modificados. Assim os valores de i e j da
formulação geral acima devem ser maiores que 0 e menores
que nlin-2 e ncol-2 respectivamente.
- Importante: A
diferenciação entre os filtros é dado pelas
diferentes máscaras aplicadas a uma imagem digital. Nos
tópicos seguintes veremos alguns exemplos dessas
aplicações.
Filtros Passa-Baixas
-
Introdução
- eliminar informações de alta frequência,
ou seja, extrair informações muito discrepantes (em geral
ruídos) da imagem digital
- suavizar a informação da imagem: o resultado da
aplicação desse filtro é a geração
de uma imagem de saída mais homogênea, ou mais suavizada,
em comparação com a imagem original
- Janelas de filtros passa-baixas:
- As máscaras 3x3, com respectivos pesos, mais comumente
utilizadas nas filtragens do tipo passa-baixas estão mostradas
na
figura abaixo. Observe que a somatória dos pesos desses filtros
é sempre igual a 1. Caso essa somatoria seja diferente de 1
deve-se dividir cada peso pela soma total dos pesos da máscara.
1
|
1
|
1
|
÷9
|
1
|
1
|
0 |
÷4
|
1
|
1
|
1
|
÷10
|
1
|
1
|
1
|
1 |
0 |
1
|
1
|
2
|
1
|
1
|
1
|
1
|
0
|
1 |
0 |
1
|
1
|
1
|
- Considere a imagem X
apresentada abaixo. Aplicando-se a janela de filtragem passa-baixas
abaixo, obteremos a imagem Z
de saída.
1/9
|
1/9
|
1/9
|
1/9
|
1/9
|
1/9
|
1/9
|
1/9
|
1/9
|
120
|
120
|
120
|
120
|
120
|
»
|
120
|
120
|
120
|
120
|
120
|
120
|
210
|
120
|
30
|
120
|
120
|
130
|
120
|
110
|
120
|
120
|
120
|
120
|
120
|
120
|
120
|
120
|
120
|
120
|
120
|
X
|
Z
|
|
- Resultado: A imagem fica mais suavizada, mais
homogênea com eliminação de ruídos, caso
existam. Perde-se nitidez e contraste, mas
ganha-se homogeneidade dos elementos da imagem.
- Os filtros passa-baixas podem ser aplicados em cascata sobre
uma
imagem digital. Quanto maior o número de iterações
forem definidos, mais homogênea será a imagem resultante.
- A Figura abaixo ilustra o resultado da filtragem
passa-baixas
sobre uma imagem digital.
Figura: Filtro Passa-Baixas aplicado
à imagem digital apresentada em (a). Em (b) apresenta-se o
resultado da aplicação do filtro com máscara 3x3 e
em (c)
com máscara 5x5
- Importante: Neste
exemplo utilizamos uma janela 3x3, porém é comum
utilizar-se máscaras com janelas 5x5, 7x7, etc.., caso seja
necessário
considerar-se
vizinhanças maiores no processo de convolução.
- Você seria capaz de
redefinir as janelas
apresentadas para máscaras com janelas 5x5? Mostre-as.
- Sugestão: Fazer exercícios de
filtros passa-baixas no SPRING e no IrfanView
Filtros não lineares para
remoção de ruídos
-
Introdução
-
Os filtros lineares passa-baixas, apresentados no ítem
anterior, servem para remoção ou suavização
de ruídos de uma imagem digital. Porém eles tem uma
desvantagem grande pois afetam muito fortemente as áreas sem
ruído homogeneizando a imagem, muitas vezes onde não se
deseja esse efeito.
- Duas outras alternativas aos filtros
lineares passa-baixas, que removem ruídos das imagens e tem
efeitos de homogeneização mais suaves, são: o
filtro da moda e o filtro da mediana.
- Os
filtros da moda e da mediana são não
lineares e, portanto, não existe uma formulação
matemática linear que descreve o processo de
aplicação dos mesmos sobre uma imagem. Esses
filtros são definidos por sequências lógicas, ou
algoritmos, que descrevem como as máscaras são aplicadas
sobre a imagem, como veremos a seguir.
- é um filtro não
linear onde o elemento central de uma região é
substituido pelo valor de nível digital mais frequente em sua
vizinhança, ou seja a moda dos seus vizinhos.
- A implementação desse
filtro se faz construindo-se um histograma dos valores vizinhos de um
pixel e tomando-se aquele valor mais frequente como novo valor do pixel
central considerado.
- Quando nao encontramos um
único valor de moda pode-se utilizar a moda que é igual
ao valor do pixel central ou, na falta deste, a moda mais proxima
do valor central.
- A
figura abaixo ilustra a aplicação
de um filtro de moda em uma região de uma imagem digital.
- Considere a imagem X
apresentada abaixo. Aplicando-se à imagem X uma filtragem de
moda , considerando-se vizinhança 8, obteremos a imagem Z
de saída apresentada à direita.
120
|
100
|
100
|
100
|
80
|
»
|
100
|
100
|
120
|
100
|
80
|
95
|
255
|
120
|
0
|
80
|
95
|
120
|
100
|
80
|
80
|
120
|
110
|
80
|
100
|
80
|
110
|
120
|
110
|
100
|
90
|
X
|
Z
|
|
- Importante: O filtro da moda garante que o
conjunto de valores digitais da imagem de saída é um
subconjunto do domínio de valores da imagem de entrada. Assim,
não são criados níveis digitais diferentes
daqueles presentes na imagem de entrada.
- também é um
filtro não linear. Neste caso o elemento central de uma
região é substituido pelo valor de nível digital
que corresponde a mediana de seus vizinhos.
- o
cálculo da mediana dos
vizinhos requer uma ordenação dos valores digitais dos
mesmos e a escolha do valor mediano, ou seja, aquele que divide o
conjunto de vizinhos em dois grupos de cardinalidades iguais.
- Uma
característica
interessante é que, sempre que se consideram vizinhanças
com cardinalidade ímpar, o filtro da mediana garante que o
conjunto de valores digitais da imagem de saída é um
subconjunto do domínio de valores da imagem de entrada.
Você concorda com esta afirmativa? Porquê?
- Considere a imagem X
apresentada abaixo. Aplicando-se à imagem X uma filtragem de
mediana, considerando-se vizinhança 9, obteremos imagem Z
de saída apresentada à direita.
100
|
100
|
120
|
100
|
80
|
»
|
100
|
100
|
120
|
100
|
80
|
95
|
255
|
120
|
0
|
115
|
95
|
110
|
110
|
110
|
115
|
110
|
120
|
110
|
110
|
80
|
110
|
120
|
110
|
100
|
80
|
X
|
Z
|
|
- Exercício: Compare as imagens Z resultantes dos filtros
de
média, moda e mediana. Quais suas diferenças
básicas? Em quais
aplicações cada filtro pode ser melhor usado?
- A Figura abaixo ilustra o resultado da filtragem com filtros
3x3 de média e mediana
(a)
|
(b)
|
(c)
|
Figura: Filtros com vizinhança
3x3 de Média (b) e de Mediana (c) aplicados sobre uma imagem com
ruído (a)
|
Filtros Passa-Altas e Detectores de Bordas
- Características dos filtros
lineares passa-altas:
- Realçam a imagem ou alvos presentes na imagem digital
- Aumenta a nitidez das transições entre diferentes
regiões de uma imagem digital.
- Podem funcionar como detectores
de pontos isolados, de linhas e de bordas presentes na imagem.
- Segue, abaixo, as máscaras de filtros
passa-altas mais
comuns.
-1
|
-1
|
-1
|
|
0
|
-1
|
0 |
|
1
|
-2
|
1
|
-1
|
8
|
-1
|
-1 |
4
|
-1
|
-2
|
4
|
-2
|
-1
|
-1
|
-1
|
0
|
-1 |
0 |
1
|
-2
|
1
|
- A soma algébrica dos
pesos das máscaras acima é igual a 0. Isso
significando que, quando aplicadas em regiões
homogêneas de uma imagem, resultará em um valor igual a 0
ou em um valor muito pequeno.
- Quando uma dessas
máscaras for aplicada em uma região heterogênea
resultará em um valor muito maior ou menor do que o valor
original.
- Um exemplo numérico de aplicação de um
filtro passa alta
- Considere
a imagem X
apresentada abaixo. Aplicando-se a janela de filtragem passa-altas
abaixo, obteremos a imagem Z
de saída.
-1
|
-1
|
-1
|
-1
|
8
|
-1
|
-1
|
-1
|
-1
|
10
|
10
|
10
|
10
|
10
|
»
|
10
|
10
|
10
|
10
|
10
|
10
|
0
|
10
|
20
|
10
|
10
|
-80
|
0
|
80
|
10
|
10
|
10
|
10
|
10
|
10
|
10
|
10
|
10
|
10
|
10
|
X
|
Z
|
|
- Observe que os valores obtidos na
imagem de
saída Z tem
diferenças mais acentuadas em
relação aos valores da imagem original X..
- Observação: Os
valores digitais
da imagem de saída podem ser menores que 0 e maiores que o
máximo
permitido para uma determinada codificação
radiométrica. Neste caso deve-se utilizar
um realce, por de histograma por exemplo, para ajustar os limites de
saída para os
limites válidos da codificação.
Importante: Neste
exemplo utilizamos uma máscara com janela 3x3, porém
é comum
utilizar-se janelas 5x5, 7x7, etc... caso se queira considerar
vizinhanças maiores.
- Filtros para
detecção de linhas e bordas
- As máscaras apresentadas
abaixo podem ser usadas para detecção
de linhas
horizontais, verticais e diagonais.
-1
|
-1
|
-1
|
|
-1
|
2
|
-1
|
2
|
2
|
2
|
-1 |
2
|
-1
|
-1
|
-1
|
-1
|
-1
|
2
|
-1
|
(a)
|
(b)
|
-1
|
-1
|
2
|
|
2
|
-1
|
-1
|
-1
|
2
|
-1
|
-1 |
2
|
-1
|
2
|
-1
|
-1
|
-1
|
-1 |
2 |
(c)
|
(d)
|
Figura: Janelas para (a) detecão de linhas horizontais, (b)
detecção de linhas verticais, (c) e (d)
detecção de linhas diagonais
- Para detecção
de bordas aplicam-se habitualmente filtros lineares de dois
tipos:
filtros
baseados na função
gradiente (derivadas de primeira ordem
nas direções dos eixos x e y da imagem) e filtros
baseados na função
laplaciano (derivadas de segunda ordem
nas direções dos eixos x e y da imagem). As
máscaras abaixo, conhecidas como operadores de Roberts e operadores de Sobel, são
utilizadas para aproximar o operador gradiente aplicado sobre os pixels
de uma imagem digital.
Operador
de Roberts
|
0
|
0
|
-1
|
|
-1
|
0
|
0
|
0
|
1
|
0
|
0 |
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
da =
p[i,j]-p[i-1,j+1]
db = p[i,j]-p[i-1,j-1]
S =
((da)2+(db])2)1/2
|
Operador
de Sobel
|
1
|
0
|
-1
|
|
1
|
2
|
1
|
2
|
0
|
-2
|
0
|
0
|
0
|
1
|
0
|
-1
|
-1
|
-2
|
-1 |
dx =
((p[i-1,j-1]+2.0*p[i,j-11]+p[i+1,j-11])/4.0 -
(p[i-1,j+1]+2.0*p[i,j+1]+p[i+1,j+1])/4. )/2.0
dy = ((p[i-1,j-1]+2.0*p[i-1,j]+p[i-1,j+1])/4.0 -
(p[i+1,j-1]+2.0*p[i+1,j]+p[i+1,j+1]/4. )/2.0
S= ((dx)2+(dy)2)1/2 |
- A figura abaixo ilustra o resultado da aplicação
dos filtros passa-altas tradicionais e de filtros de
detecção de bordas de Roberts e de Sobel.
Figura: Filtro Passa-Altas aplicado
à
imagem digital apresentada em (a). Em (b) apresenta-se o resultado da
aplicação do filtro passa-altas com mácara de
janela 3x3, em (b) o
operador de Roberts e em
(c) o operador de Sobel
- Ao utilizar-se filtros passa-altas, a imagem fica mais
heterogênea com um realce das transições entre
cores presentes na imagem. Ganha-se em nitidez das diferenças
mas perde-se homegeneidade dos elementos da imagem.
- A imagem (b) da figura anterior mostra que o filtro
passa-altas tradicional realçou diferenças de uma forma
pontual sem detectar continuidades de bordas dos elementos da imagem.
- O filtro detector de bordas que utiliza o operador de Sobel
muitas
vezes mostra resultados de bordas mais realçados do que o que
utiliza o
operador de Roberts. Porém o operador de Sobel é mais
sensível a ruídos
(amplia ruídos presentes na imagem), como se pode observar na
imagem (d) da figura anterior. Veja abaixo exemplos de aplicacao dos
filtros de Robert e Sobel para imagens coloridas.
(a)
|
(b)
|
(c)
|
Figura: Filtros detectores de bordas:
(a) imagem colorida original, (b) Filtro de Roberts e (c)
Filtro de Sobel
- A figura abaixo mostra o uma imagem realçada nas
bordas ( figura da direita) como resultado da detecção de
bordas (filtro de bordas de Roberts, figura esquerda inferior)
adicionado à imagem original (figura esquerda superior). Nota-se
que a imagem final tem um brilho médio maior e os detalhes de
bordas mais acentuados em relação a imagem original.
(a)
|
(b)
|
(c)
|
Figura: Filtros detectores de bordas:
(a) imagem colorida original, (b) Filtro de Sobel e (c)
Imagem Original + Filtro de Sobel
- Existem outros filtros passa-altas que trabalham com operadores
direcionais. Fica para o aluno pesquisar sobre esses filtros quando for
de seu interesse ou necessidade.
- Filtros espaciais morfológicos e filtros no domínio
da frequência
- Convém salientar que, além dos filtros espaciais
apresentados nesta apostila, existem filtros espaciais
não lineares conhecidos como filtros morfológicos e
também filtros no
domínio da frequência. Esses temas estão fora do
escopo desta apostila, mas podem ser encontrados com facilidade na
literatura.
Exercícios
Laboratório - Filtragem passa-baixas em uma imagem digital.
Faça um programa em Java, para filtrar uma imagem com filtro
passa-baixas sobre
uma imagem do tipo JPEG (.jpg). Utilize a imagem abaixo, ou outra
imagem qualquer, para minimizar os problemas do ruido da imagem.
Programe pelo menos 2 tipos de filtragem (2 mascaras diferentes) para
comparar o efeito de filtros diferentes.
- Visualize a imagem de saída.O
que
ocorreu comparando-se a imagem original com as imagens de saida?
- Faça um relatório sobre o laboratório e
envie para o portifólio do curso.
Observação: O
relatório deve ser digital e deve conter:
Identificação do aluno (
nome, nro de matrícula, outros...) e data.
Nome do experimento do laboratório.
Uma introdução explicitando o objetivo do trabalho do
laboratório.
Uma descrição da metodologia utilizada para
resolver o problema.
Uma descrição dos resultados obtidos com análises
pertinentes.
Uma seção de conclusão com opiniões
próprias de cada
aluno e sugestões gerais relacionadas com o experimento.
Laboratório - Filtragem passa-altas detector de bordas em uma
imagem digital.
Faça um programa em Java, para realizar a filtragem de deteccao
de bordas de Roberts numa imagem JPEG com filtro
passa-altas . Utilize a imagem abaixo, ou outra
imagem em níveis de cinza qualquer, como imagem de entrada.
- Visualize a imagem de saída.O
que
ocorreu comparando-se a imagem original com as imagens de saida?
- Faça um relatório sobre o laboratório e
envie para o portifólio do curso.
Observação: O
relatório deve ser digital e deve ser conter:
Identificação do aluno (
nome, nro de matrícula, outros...) e data.
Nome do experimento do laboratório.
Uma introdução explicitando o objetivo do trabalho do
laboratório.
Uma descrição da metodologia utilizada para
resolver o problema.
Uma descrição dos resultados obtidos com análises
pertinentes.
Uma seção de conclusão com opiniões
próprias de cada
aluno e sugestões gerais relacionadas com o experimento.
Exercícios gerais
1. Faça operações
utilizando o SPRING (Ative um Plano de Informação da
categoria Imagem. Ative a função de
operações aritméticas no menu Imagem do
SPRING). Utilize essa função para executar
operações aritméticas sobre duas bandas presentes
no seu banco de dados. Aplique operações de realce
por contraste na banda de saída, quando necessário.
3. Aplique um filtro de média 5x5 na imagem X abaixo, mostrando
o resultado da imagem de saída Z após a
aplicação do filtro. Qual sua conclusão ao
comparar a imagem X com a imagem Z?
15 18 13 16 20
X = 30 37 40 32 28
16 10 15 18 14
70 77 66 55 60
4. Apresentou-se algumas máscaras para
implementação de filtros lineares de média. Um
filtro que substitui o filtro de média, com algumas vantagens,
é o filtro de mediana. Pesquise para saber como seria a
implementação do filtro de mediana e qual sua vantagem em
relação ao filtro de média.
5. Aplique um filtro passa-altas 3x3 na imagem X abaixo, mostrando o
resultado da imagem de saída Z após a
aplicação do filtro. Qual sua
conclusão ao comparar a imagem X com a imagem Z?
15 18 13 16 20
X = 30 37 40 32 28
16 10 15 18 14
70 77 66 55 60
6. Faça o mapeamento dos valores da imagem Z do exercício
anterior para níveis digitais de 0 a 255
7. Explique como você faria para
aplicar
filtros espaciais em imagens coloridas, cada
qual com a s suas
3 componentes R, G e B.
Apêndice: Estrutura básica de um
Programa em Java para filtro de Mediana
// Uso de ImageIO com BufferedImage
// Vantagens: ve varios tipos de imagens,
// Dá acesso aos elementos de uma imagem e visualiza
dado processado
import java.io.File;
// pacotes do AWT
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
// pacote Swing para definir interface gráfica
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.ImageIcon;
// leitura em modo imediato - para J2SE 1.4+
import javax.imageio.ImageIO;
public class FiltroMediana extends JFrame {
public static void main(String args[]) {
// Mostra JFrame decorado pelo Swing
JFrame.setDefaultLookAndFeelDecorated(true);
// Carrega e Visualiza imagem original
String ima_name_in =
"Comp453ruido.jpg";
String ima_name_out =
"Comp453Proc.jpg";
// String ima_name_in = "ccd1.gif";
// String ima_name_out =
"Saida.gif";
BufferedImage ima_in =
CarregaImagem(ima_name_in);
FiltroMediana frame1
= new FiltroMediana();
frame1.MostraImagem(ima_in,
ima_name_in);
// Carrega e processa imagem original e mostra
imagem processada
BufferedImage ima_out =
ProcessaImagem(ima_in);
FiltroMediana frame2 = new
FiltroMediana();
frame2.MostraImagem(ima_out,
ima_name_out);
SalvaImagem(ima_out,
ima_name_out);
}
// Método para carregar uma imagem do disco para um objeto da
classe BufferedIma
public static BufferedImage
CarregaImagem(String image_name) {
// Associa objeto BufferedImage com
<arquivo_imagem>
BufferedImage ima_in = null;
// Carrega imagem
File file = new File(image_name);
try {
ima_in= ImageIO.read(file);
} catch(Exception e) {
System.out.println("Imagem '" + image_name + "' nao existe.");
System.exit(0);
}
System.out.println("Nome da
Imagem: "+image_name+" Tipo da Imagem: "+ima_in.getType());
System.out.println("Tamanho da
Imagem: Colunas "+ima_in.getWidth()+" Linhas "+ima_in.getHeight());
return ima_in;
}
// Método para Salvar uma imagem no formato JPEG
public static void SalvaImagem(BufferedImage dest,
String image_name) {
try {
ImageIO.write(dest, "jpg", new File(image_name));
} catch (Exception e) {
System.out.println("Problema gravando arquivo. ");
System.exit(0);
}
}
// Método para Processar uma Imagem
public static BufferedImage ProcessaImagem
(BufferedImage ima_in) {
// Cria imagem de saida com mesmo tamanho e tipo da
imagem de entrada
BufferedImage ima_out = new
BufferedImage(ima_in.getWidth(),ima_in.getHeight(),ima_in.getType());
// Recupera matriz das imagens de entrada e saida
Raster raster =
ima_in.getRaster(); // declara e instancia objeto raster soh para
leitura
WritableRaster wraster =
ima_out.getRaster(); // declara e instancia objeto raster para escrita
// Processa valores da imagem de entrada e armazena
na imagem de saida
double valornr, valorng, valornb;
int[] v = new int[9];
for(int y=1;
y<ima_in.getHeight()-1; y++)
for(int x=1;
x<ima_in.getWidth()-1; x++){
// Aplica
Filtro de Mediana 3x3
LeJanela3x3(raster,v,x,y,0);
valornr = CalcMediana(9,v);
LeJanela3x3(raster,v,x,y,1);
valorng = CalcMediana(9,v);
LeJanela3x3(raster,v,x,y,2);
valornb = CalcMediana(9,v);
wraster.setSample(x,y,0,(int)(valornr+.5));
wraster.setSample(x,y,1,(int)(valorng+.5));
wraster.setSample(x,y,2,(int)(valornb+.5));
}
return ima_out;
};
// Método para mostrar uma imagem em um frame
public void MostraImagem(BufferedImage ima, String
image_name) {
// Define GUI com objetos do Swing
JLabel lsrc2 = new
JLabel(new ImageIcon(ima));
getContentPane().add(new
JScrollPane(lsrc2));
// Atribui nome e tamanho ao frame
setTitle("Java2DImageDisplay: =>" + image_name);
setSize(ima.getWidth()+40,
ima.getHeight()+40);
setVisible(true);
// Encerra a aplicação clicando no
"close"
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// Método para Ler uma janela 3x3 de uma banda de uma
imagem de entrada num vetor v.
// (x,y) representa a coluna e a linha central da janela
public static void LeJanela3x3(Raster raster, int
[]v, int x, int y, int banda){
v[0] = raster.getSample(x-1,y-1,banda);
v[1] = raster.getSample(x ,y-1,banda);
v[2] = raster.getSample(x+1,y-1,banda);
v[3] = raster.getSample(x-1,y ,banda);
v[4] = raster.getSample(x ,y ,banda);
v[5] = raster.getSample(x+1,y ,banda);
v[6] = raster.getSample(x-1,y+1,banda);
v[7] = raster.getSample(x ,y+1,banda);
v[8] = raster.getSample(x+1,y+1,banda);
return;
}
// Método para Cálculo da Mediana de um vetor de npts
pontos
public static double CalcMediana(int npts, int []v){
int aux;
// Ordena em ordem crescente os elementos do vetor
for(int i=0; i<npts-1; i++)
for(int j=i+1; j<npts;
j++)
if(v[i] >
v[j]){
aux = v[i]; v[i]=v[j]; v[j]=aux;
}
// Define o valor da mediana
if((npts%2)==0)
return((double)v[npts/2]);
else
return((double)((v[npts/2]+v[npts/2+1])/2.));
}
} // fim da classe FiltroMediana