IA636:Exp Carros
De DCA-Wiki
Experimento de Filtragem-Inversa - Veículos em movimento
Objetivo: recuperar imagem borrada de veículo em movimento capturada a partir de uma camera fotográfica estática (tripé na calçada).
Metodologia: encarar o borrão da imagem como um filtro de média, modelando sua máscara de convolução equivalente e realizando a filtragem inversa.
Modelagem
Parâmetros
<math>\alpha</math> = angulo de abertura da lente
<math>L_m</math> = largura em metros coberta pela imagem no plano de interesse (carro).
<math>L_p</math> = largura da imagem em pixels
<math>T_v</math> = tempo de exposição (segundos)
<math>d</math> = distancia do objeto ao sensor (metros)
<math>v_m</math> = velocidade do carro (m/s)
1-) Qual a largura (em metros) coberta por um pixel?
<math>\frac{W_m}{W_p} = \lbrack m/pixel \rbrack = ?</math>
<math>W_m = 2. d. tan(\frac{\alpha}{2}) \longrightarrow \frac{W_m}{W_p} = \frac{2 d}{W_p} tan(\frac{\alpha}{2})</math>
2-) Quantos pixels diferentes um mesmo ponto do carro em movimento iluminou?
<math>N_{pi}</math> = número de pixels iluminados
<math>V_m T_v</math> = distância percorrida (metros) por um ponto do carro durante o tempo de exposição da foto
<math>N_{pi} = \frac{V_m T_v}{\frac{W_m}{W_p}} = \frac{V_m T_v W_p}{2 d tan(\frac{\alpha}{2})}</math>
3-) Projeto da Máscara de Convolução
Como o carro movimenta-se apenas na horizontal, a máscara equivalente possui dimensão <math>\lbrack 1, N_{pi} \rbrack</math>.
Supondo o carro movimentando-se para a direita, ao longo do tempo tem-se:
Ou seja, ao final de um certo período de tempo, o pixel <math>S_4</math> do sensor (imagem) terá sido uma média dos pontos <math>C_4, C_3, C_2, C_1</math> do carro:
<math> S_4 = \frac{C_4 + C_3 + C_2 + C_1}{4}</math>
Seja g a imagem borrada (foto) e f a imagem "original", pode-se generalizar:
<math> g(x) = f(x) + f(x-1) + f(x-2) + f(x-3) + ... + f(x - N_{pi})</math>
O que leva a seguinte máscara de convolução:
onde <math>\triangle</math> é uma porcentagem relativa a parte decimal de <math>N_{pi}</math>, pois o último pixel da máscara não é totalmente iluminado:
<math>\triangle= decimal\lbrace N_{pi} \rbrace \times \frac{1}{N_{pi}}</math>
4-) Filtragem Inversa
Seja <math>h</math> a máscara de convolução equivalente, pode-se considerar que o borrão no carro presente na imagem g foi gerado pela convolução:
<math>g = f * h </math>
Ou, no domínio da frequencia:
<math> G = F . H </math>
E, assim, podemos realizar a filtragem inversa do sinal:
<math> F = \frac{G}{H}</math>
Implementação (Matlab)
function f = carros(g, alpha, Wp, Tv, d, Vm);
Npi = Vm*Tv*Wp/(2*d*tan(deg2rad(alpha)/2))
%Tamanho Mascara:
tam_mascara = ceil(Npe);
%Cria uma imagem de mascara acrescentando zeros para que o
%centro seja o pixel mais a direita da mascara (objeto movimentando-se da
%esquerda para a direita)
mascara = [ones(1,tam_mascara) zeros(1,tam_mascara-1)];
%Calcula o DELTA para o último pixel da máscara:
mascara(1)=rem(Npe,floor(Npe));
%Normaliza:
mascara = mascara/Npe;
%Caso o carro estivesse vindo em sentido contrario, inverte a mascara:
%mascara = flipdim(mascara,2);
%Monta mascara periodica centrada na origem
h = zeros(size(g));
h(1,1:(2*tam_mascara-1)) = mascara;
h = iaptrans(h,[0, 1-tam_mascara]);
%Realiza a transformada do filtro:
H = iadft(h);
%Transformada da imagem borrada:
G = iadft(g);
%Realiza filtragem inversa:
F = (G.*H)./((H.*H) + Hconst);
%Volta para dominio espacial:
f = uint8(ianormalize(abs(iaidft(F)),[0 255]));



