Eu tenho uma imagem 2D, que eu quero filtro lowpass, com essas restrições / métricas de qualidade:
- Como não posso "adicionar" luz à imagem, cada pixel no resultado deve ser <= o pixel correspondente na entrada.
- A frequência de corte lowpass deve ser um parâmetro, para experimentar
- A aplicação repetida desse filtro não deve alterar o resultado de maneira significativa.
- O tempo necessário para executar esse algoritmo (5 minutos para uma imagem de 5 MPix parece razoável)
- Minimizar a quantidade de luz que é filtrada.
Abaixo estão algumas abordagens que tentei, juntamente com suas deficiências:
Filtro Gaussiano como o normal, puxe o resultado para baixo para cumprir a restrição 1. Isso está de acordo muito bem com os três primeiros pontos, mas reduz muito mais a luz do que o necessário.
Ajustar parábolas "para cima" através dos pontos "baixos" e parábolas "para baixo" entre eles para suavizar. Isso funciona muito bem em 1D, mas aplicá-lo primeiro na horizontal e depois na vertical produz maus resultados em 2D. Leva muito mais tempo, mas não muito para o meu aplicativo. No entanto, a aplicação repetida desse filtro alterará drasticamente o resultado. Se a entrada (1D) for uma parábola "descendente" perfeita (que não deve ser filtrada), ela será substituída por 2 parábolas "ascendentes" sentadas no início / fim.
Usando alguma outra forma de funções "básicas" 2D e solução linear para encontrar os parâmetros ideais. Esta é uma ideia apenas atualmente, ainda não implementada / testada.
Meu domínio de experiência no processamento de sinais é quase exclusivamente processamento de imagens, por isso espero encontrar alternativas para esse problema com a participação de especialistas ativos em outras áreas do processamento de sinais.
update 18/08/2011
Com base nas reações atuais, decidi deixar as coisas um pouco mais claras adicionando gráficos de uma entrada típica e os resultados das três abordagens que descrevi originalmente + as sugestões que recebi até agora. Para facilitar a comparação, usei apenas a filtragem 1D nesses exemplos.
Dados de entrada:
Filtro Gaussiano + reduza-o para atender ao requisito (1).
Você pode ver que derrubá-lo resulta em reduções desnecessárias de luz no lado direito.
Parábolas Para
mim, isso é excelente, mas infelizmente não se traduz perfeitamente em 2D, aplicando primeiro a horizontal e depois a vertical. Nesse caso, você também vê que posso avaliar as parábolas ajustadas na resolução de ponto flutuante, o que é um pequeno benefício, mas não é absolutamente necessário.
Erosão da escala de cinza
Com base na sugestão de rwong, tentei a erosão da escala de cinza. Eu usei um elemento estruturador com a mesma forma parabólica que minhas parábolas "ajustadas". O resultado é quase exatamente o mesmo, então isso parece promissor. No entanto, ainda existem alguns problemas: 1. Meu elemento estruturador não era "suficientemente grande" (embora já tivesse 801 pixels de largura) 1. Só tenho parábolas "para cima", sem parábolas para baixo para facilitar a transição de uma parábola para o próximo.
Filtragem mediana
Somente incluída para ser completa, não é exatamente o que eu quero.
dados brutos
Colei os dados de entrada brutos + os vários comandos python no pastebin, para que você também possa experimentar os mesmos dados.
http://pastebin.com/ASnJ9M0p