Upload
cledson-souza
View
221
Download
2
Embed Size (px)
Citation preview
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.
FIGURA COM RUIDO
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 MSE3 0,1 1,81025 0,1 0,39237 0,1 0,34549 0,1 0,2914
15 0,1 0,273717 0,1 0,2379
Tabela 01 – Redução do MSE x bloco
Evolução do Erro
0,0
0,5
1,0
1,5
2,0
0 2 4 6 8 10 12 14 16 18
Largura das Regiões de Supore
MS
E
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
50 100 150 200 250
50
100
150
200
250
FIGURA FILTRADA COM BLOCO=5
50 100 150 200 250
50
100
150
200
250
FIGURA FILTRADA COM BLOCO=7
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
FIGURA FILTRADA COM BLOCO=9
50 100 150 200 250
50
100
150
200
250
FIGURA FILTRADA COM BLOCO=15
50 100 150 200 250
50
100
150
200
250
FIGURA FILTRADA COM BLOCO=17
50 100 150 200 250
50
100
150
200
250
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
50 100 150 200 250 300 350 400 450 500
50
100
150
200
250
300
350
400
450
500
FIGURA COM RUIDO
50 100 150 200 250 300 350 400 450 500
50
100
150
200
250
300
350
400
450
500
FIGURA FILTRADA COM BLOCO=3
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
50 100 150 200 250 300 350 400 450 500
50
100
150
200
250
300
350
400
450
500
FIGURA COM RUIDO
50 100 150 200 250 300 350 400 450 500
50
100
150
200
250
300
350
400
450
500
FIGURA FILTRADA COM BLOCO=3
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 memoriaclear all
%Inicializacao das variaveisSN=0.1;bloco=3;k=0;
%leitura e exibicao na tela da imagem originalim=imread('baboon.tiff');d=(double(im)/256);colormap grayfigure(1);imagesc(d),title('FIGURA ORIGINAL');colormap gray
%calculo , adicao do ruido e exibicao da imagem com ruidoN=double(sqrt(SN)*randn(size(d)));u=d+N;colormap grayfigure(2);imagesc(u),title('FIGURA COM RUIDO');colormap Gray
%Loop para obtencao das amostras no tamanho dos blocoscov_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);
endend
%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 erroY = 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