J'ai une image 2D, que je souhaite filtrer passe-bas, avec ces contraintes / mesures de qualité:
- Je ne peux pas "ajouter" de lumière à l'image, donc chaque pixel du résultat doit être <= le pixel correspondant dans l'entrée.
- La fréquence de coupure passe-bas doit être un paramètre, pour expérimenter avec
- L'application répétée de ce filtre ne devrait pas modifier le résultat de manière significative.
- Le temps qu'il faut pour exécuter cet algorithme (5 minutes pour une image 5MPix semble raisonnable)
- Minimiser la quantité de lumière qui est filtrée.
Voici quelques approches que j'ai essayées, ainsi que leurs lacunes:
Filtre gaussien comme d'habitude, puis tirez le résultat vers le bas pour respecter la contrainte 1. Cela correspond très bien aux 3 premiers points, mais réduit beaucoup plus de lumière que nécessaire.
Montage des paraboles "vers le haut" à travers les points "bas" et des paraboles "vers le bas" entre elles pour lisser. Cela fonctionne très bien en 1D, mais l'appliquer d'abord horizontalement, puis verticalement produit de mauvais résultats en 2D. Cela prend beaucoup plus de temps, mais pas trop longtemps pour mon application. Cependant, l'application répétée de ce filtre changera radicalement le résultat. Si l'entrée (1D) est une parabole "descendante" parfaite (qui ne doit pas du tout être filtrée), elle sera remplacée par 2 paraboles "ascendantes" situées au début / fin.
Utiliser une autre forme de fonctions "basiques" 2D et une résolution linéaire pour trouver les paramètres optimaux. C'est une idée seulement actuellement, non encore implémentée / testée.
Mon domaine d'expérience dans le traitement du signal étant presque exclusivement le traitement d'images, j'espère donc trouver des alternatives à ce problème avec la contribution d'experts actifs dans d'autres domaines du traitement du signal.
mise à jour 2011/08/18
Sur la base des réactions actuelles, j'ai décidé de rendre les choses un peu plus claires en ajoutant des graphiques d'une entrée typique et les résultats des 3 approches que j'ai décrites à l'origine + les suggestions que j'ai reçues jusqu'à présent. Pour une comparaison facile, j'ai utilisé uniquement le filtrage 1D dans ces exemples.
Des données d'entrée:
Filtre gaussien + abaisser pour se conformer à l'exigence (1).
Vous pouvez voir que le réduire entraîne des réductions de lumière inutiles sur le côté droit.
Paraboles
En ce qui me concerne, c'est à peu près excellent, malheureusement cela ne se traduit pas parfaitement en 2D en appliquant d'abord horizontal, puis vertical. Dans ce cas, vous voyez également que je peux évaluer les paraboles ajustées en résolution à virgule flottante, ce qui est un petit avantage, mais pas absolument nécessaire.
Érosion en niveaux de gris
Sur la base de la suggestion de rwong, j'ai essayé l'érosion en niveaux de gris. J'ai utilisé un élément structurant avec la même forme parabolique que mes paraboles "ajustées". Le résultat est presque exactement le même, donc cela semble prometteur. Cependant, il y a encore quelques problèmes: 1. Mon élément structurant n'était pas "assez grand" (même s'il faisait déjà 801 pixels de large) 1. Je n'ai que des paraboles "vers le haut", pas de "paraboles vers le bas pour faciliter la transition d'une parabole au suivant.
Filtrage médian
Seulement inclus pour être complet, ce n'est pas vraiment ce que je veux.
données brutes
J'ai collé les données d'entrée brutes + les diverses commandes python sur pastebin, afin que vous puissiez également expérimenter avec les mêmes données.
http://pastebin.com/ASnJ9M0p