Sei sulla pagina 1di 9

Restauração de Imagem usando Filtro de Wiener

Cledson Souza

20 de julho de 2010
Introdução

Neste projeto, investigaremos a restauração de imagem usando filtragem de Wiener.

Para testar nosso algoritmo iremos intencionalmente degradar uma imagem e tentar restaurá-

la. Usaremos o algoritmo no tempo discreto e assumimos certas premissas sobre o sinal que

consideraremos estacionário e sobre o ruído que deverá ter media =0. O algoritmo será

implementado no MATLAB 7.0 usando as funções de matriz covariância, correlação cruzada

e convolução. Não usaremos nenhuma das funções da “toolbox” da ferramenta.

Teoria

A degradação da imagem pode ser modelada como um borrão, ou com vários tipos de

ruído, o ruído neste caso terá distribuição gaussiana e uniforme, assim a imagem de entrada

sofrerá uma adição de ruído branco ver diagrama na figura 1

Figura 1 – Diagrama de blocos adaptado das notas de aula

O diagrama de bloco acima pode ser descrito com a seguinte equação:


Como já mencionado, assumindo que x(n) tem média zero e, além disso, assumindo

que os coeficientes Wn não mudam com o tempo e a saída do filtro é a convolução da entrada

com os coeficientes de Wiener (w), então obtemos:

Onde N é o número de coeficientes do filtro.

Não nos alongaremos no detalhamento das matrizes de autocorelação e correlação

cruzada, bastando apenas dizer que o Erro Médio Quadrático é dado por:

J(w) = E[e2(n)]= E[[d(n)-wT-x(n)]2]

J(w) = E[[d(n)-wT-x(n)][d(n)- wTx(n)]T

J(w) = E[d2(n)-wTx(n)d(n)-d(n) xT(n)w +wT x(n) xT (n)w]

J(w) = E[d2(n) ]-2wTE[d(n)x(n)] +wT E[x(n) xT (n) ]w

= σ2d – 2 wT Pdx+ wT Rxw

Assim, Jmin= σ2d – Pdx T + Rx-1 Pdx

Onde:

wT x(n)= xT(n)w = escalar

σ2d= variância do sinal desejado, d(n)

Pdx= Vetor correlação cruzada entre d(n) e x(n)

Rx = Matriz autocorrelação de x(n)


Implementação:

O algoritmo implementado usando o MATLAB e todas as imagens foram

normalizadas no intervalo entre [0,1] em função da adição do ruído através da função

RANDN.

A imagem usada foi a Lena.jpg 256x256:

FIGURA ORIGINAL

50

100

150

200

250
50 100 150 200 250

Usamos o desvio padrão SN=0,1 para a geração do ruído branco adicionado a imagem.

FIGURACOMRUIDO

50

100

150

200

250
50 100 150 200 250

O código também usa a variável bloco para parametrizar a largura das regiões de

suporte ao longo do programa, Nesse caso variamos para a imagem Lena de 3x3 a 19x19.

Abaixo, Tabela 01, coma discriminações dos valores de erro, SN e largura dos macroblocos e
o Gráfico 01 com a evolução do erro médio quadrático em função do aumento da largura dos

blocos

Tam_bloco SN MSE
3 0,1 1,8102
5 0,1 0,3923
7 0,1 0,3454
9 0,1 0,2914
15 0,1 0,2737
17 0,1 0,2379
Tabela 01 – Redução do MSE x bloco

Evolução do Erro

2,0

1,5
MSE

1,0

0,5

0,0
0 2 4 6 8 10 12 14 16 18
Largura das Regiões de Supore

Gráfico 01

O Gráfico 01 demonstra o resultado esperado, um salto decrescente do erro de 1,8102 com

blocos=3x3 para 0,3923 com blocos de 5x5 depois uma queda mais lenta até 15x15.

O experimento foi feito sempre normalizado com SN=0,1, somente variando o tamanho dos

blocos.

Abaixo vemos uma Tabela 02 com as imagens restauradas, notamos que na borda inferior e

direita das imagens filtradas, há um aumento de uma faixa escura, isto acontece devido ao

crescimento das regiões de suporte e da faixa de pixels lidos, há maneiras de suavizar este

efeito.
FIGURA FILTRADA COM BLOCO=3 F IG U R A F IL T R A D A C O M B L O C O = 5 F IG URA F ILTRA DA CO M B LO CO= 7

50 50 50

100 100 100

150 150
150

200
200 200

250
250 250
50 100 150 200 250
50 100 150 200 250 50 100 150 200 250

Imagem filtrada com bloco=3x3 Imagem filtrada com bloco=5x5 Imagem filtrada com bloco=7x7

F IG U R A F IL TR A D A C O M B L O C O = 9 F IG U R A F IL T R A D A C O M B L O C O = 1 5 F IG U R A F IL T R A D A C O M B LO C O = 17

50 50 50

100 100 100

150 150 150

200 200 200

250 250 250

50 100 150 200 250 50 100 150 200 250 50 10 0 1 50 2 00 25 0

Imagem filtrada com bloco=9x9 Imagem filtrada com bloco=15x15 Imagem filtrada com bloco=17x17

Tabela 02 - Imagens restauradas em ordem crescente de tamanho de bloco.

FIGURA ORIGINAL F IG U R A C O M R U ID O F IG U R A F IL T R A D A C O M B L O C O = 3

50 50 50

100 100 100

150 150 150

200 200
200

250 250
250

300 300
300
350
350 350
400
400 400
450
450 450
500
500 500 50 100 150 200 250 300 350 400 450 500
50 100 150 200 250 300 350 400 450 500 50 100 150 200 250 300 350 400 450 500

Imagem Original Imagem com ruído gaussiano, SN-0,1 Imagem filtrada com bloco=3x3

Tabela 03 - Comparação de tratamento da imagem f16.tiff


FIGURA ORIGINAL FIGURA COM RUIDO F IG U R A F IL T R A D A C O M B L O C O = 3

50 50 50

100 100 1 00

150 150 1 50

200 2 00
200
250 2 50
250
300 3 00
300
350 3 50
350
400
400 4 00
450
450 4 50
500
500 5 00
50 100 150 200 250 300 350 400 450 500
50 100 150 200 250 300 350 400 450 500 50 100 150 200 250 300 350 400 450 500

Imagem Original Imagem com ruído gaussiano, SN=0,1 Imagem filtrada com bloco=3x3

Tabela 04 - Comparação de tratamento da imagem baboon.tiff

Conclusão

O filtro de Wiener é usado para reduzir a quantidade de ruído comparando com o sinal

desejado. Como é possível observar nos resultados a restauração da imagem não é

absolutamente perfeita, porém consegue um resultado muito próximo do original, mesmo em

um PC pouco robusto. Observamos que o erro é reduzido drástica e rapidamente variando os

blocos de 3x3 para 5x5, mas a partir de blocos com largura maior que 15x15 o tempo exigido

para a execução aumenta consideravelmente e para blocos maiores cada vez mais memória é

necessária devido ao cálculo da matriz inversa, tornando o algoritmo muito custoso.


Código:

% Limpeza da memoria
clear all
%Inicializacao das variaveis
SN=0.1;
bloco=3;
k=0;
%leitura e exibicao na tela da imagem original
im=imread('baboon.tiff');
d=(double(im)/256);
colormap gray
figure(1);imagesc(d),title('FIGURA ORIGINAL');
colormap gray
%calculo , adicao do ruido e exibicao da imagem com ruido
N=double(sqrt(SN)*randn(size(d)));
u=d+N;
colormap gray
figure(2);imagesc(u),title('FIGURA COM RUIDO');
colormap Gray
%Loop para obtencao das amostras no tamanho dos blocos
cov_aux = zeros(64516,bloco^2);
d_aux = zeros(64516,1);for n = 2:256-bloco+1; %254,
for m = 2:256-bloco+1; %254,
B=u(n:n+bloco-1,m:m+bloco-1);
v=zeros(1,bloco^2);
v(:)=B;
k=k+1;
cov_aux(k,:)=v(1,:);
d_aux(k) = d(n+1,m+1);
end
end
%Calculo da autocorrelação , correlação cruzada e dos coeficientes de Wiener
Ru=cov(cov_aux);
C = cov([cov_aux d_aux]);
Pud = C(1:bloco^2,bloco^2+1);
W=(Ru^(-1))*Pud;
W = reshape(W,bloco,bloco);
%Obtenção da imagem filtrada, exibição da imagem e calculo do erro
Y = conv2(W,u);
colormap gray;
figure,imagesc(Y), title(['FIGURA FILTRADA COM BLOCO=',num2str(bloco)]);
colormap gray;
eaux=sum(d-Y(1:256,1:256)).^2;
e=(sum(eaux))/65536
Bibliografia

1. Adaptive Filtering Primer with MATLAB - Poularikas and Ramadan.- Taylor and
Francis -2006
2. Notas de Aula – Filtros adaptativos 1/2010 – Prof. Murilo Bresciani de Carvalho.
3. Adaptive Filtering Algorithms and Practical Implementation – Springer - 2008

Potrebbero piacerti anche