Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

rodrigosoares

Filtro de média deslizante

Mensagens Recomendadas

rodrigosoares    0
rodrigosoares

Boas,

espero que me possam ajudar, trata-se de uma função MATLAB que era suposto aplicar um filtro por média deslizante, linha a linha, utilizando o pixel anterior, o actual e o seguinte ao longo de toda a função...

o código que utilizei foi:

function new_image=meanfilter(image_input, a, b, c)
%
% SYNTAX
% new_image=meanfilter(image_input, a , b , c);
%
% DESCRIPTION
% ESTA FUNÇ O RECEBE UM IMAGEM INICIAL, image_input, QUE, POR ACÇ O DE UMA
% FÓRMULA INTRINSECA A ELA MESMA, VAI APLICAR UM FILTRO POR MÉDIA
% DESLIZANTE SEGUNDO OS PARAMETROS a, b E c, QUE CORRESPONDEM AOS
% PARAMETROS QUE, PIXEL A PIXEL, V O INFLUENCIAR O PIXEL ANTERIOR, O ACTUAL
% E O SEGUINTE, RESPECTIVAMENTE.
%
% EXAMPLE
% imagemfiltrada=meanfilter('imagem_inicial', 1, 1, 1);
% NESTE EXEMPLO APLICA-SE UM FILTRO QUE TRABALHA COM A MÉDIA ARITMÉTICA DOS
% PIXEIS VIZINHOS E VAI RETORNAR UMA IMAGEM NOVA, DE ACORDO COM OS
% PARAMETROS INSERIDOS.
%

test_str=ischar(image_input);       % NA PRIMEIRA FASE TESTA-SE SE FOI
if test_str==1                      % INSERIDO NO INPUT UMA STRING OU UMA
   A=imread(image_input);          % VARIAVEL DO MATLAB
else
   A=image_input;
end

rgb_t=is_rgb(A);                    % DEPOIS EFECTUA-SE, SE NECESSÁRIO,
if rgb_t==1                         % UMA CONVERS O DE IMAGEM A CORES PARA
   A=rgb2gray(A);                  % ESCALA DE CINZA
end

if (abs(a)+abs(b)+abs(c))==0        % ANTES DA FUNÇ O CORRER A FÓRMULA
   error('Não é possível aplicar o filtro (erro na divisão por 0).')
end                                 % CARACTERÍSTICA, VAI SER TESTADO SE A
                                   % SOMA DOS VALORES ABSOLUTOS É
                                   % DIFERENTE DE ZERO, DE MODO A QUE, NA
                                   % FÓRMULA, SE EVITE A DIVIS O POR 0.

[nLines nCol]=size(A);


for k=1:nLines                      % ESTA É A FÓRMULA INTRINSECA A ESTA
   for g=2:(nCol-1);               % FUNÇ O E É RESPONSÁVEL POR GERAR UMA
       G(k,g)=((a*A(k,g-1)+b*A(k,g)+c*A(k,g+1))/(abs(a)+abs(b)+abs(c)));
   end                             % IMAGEM NOVA ONDE JÁ ESTÁ APLICADO O
end                                 % FILTRO DE ACORDO COM OS PARAMETROS
                                   % INDICADOS NO INICIO.
G(:,1)=A(:,1);
G(:,nCol)=A(:,nLines);
new_image=G;
imshow(new_image);
no entanto, se os parametros forem a=1 b=1 e c=1, por exemplo, a imagem final aparece toda cinzenta...

por favor ajudem me com ideias, opiniões, tudo o que for possível

obrigado

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pedrosorio    5
pedrosorio

Uma regra fundamental do Matlab é não deixar crescer matrizes dentro de ciclos. Antes do ciclos devias ter G=A para inicializar a matriz G e assim evitavas ainda as duas linhas que vêm a seguir ao ciclo (e a linha G(:,nCol)=A(:,nLines); está incorreta). Por outro lado, embora não tenha tanta relevância, estar constantemente a calcular (abs(a)+abs(b)+abs(c)) dentro do ciclo não faz sentido.

Não sei se sabes mas a função imfilter permite aplicar qualquer filtro a uma imagem e evita usar ciclos for, pelo que é bastante mais eficiente. Em relação ao problema da imagem cinzenta, será que podes mostrar qual é a imagem que estás a usar como input?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rodrigosoares    0
rodrigosoares

o objectivo do trabalho é fazer o filtro sem utilizar funçoes de imagens do matlab...

já fiz algumas alterações que vou postar mas acho que já vou conseguir

inicializei a matriz g como uma matriz de zeros pelo que resolveu o problema que referiste também...

obrigado pela ajuda :confused:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade