12.07.2015 Views

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

Algorithmes de la morphologie mathématique pour - Pastel - HAL

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Jaromír BRAMBOR8.2. APPROCHE EMPLOYANT LES ALGORITHMES À RÉUTILISATION DES VALEURSvaleurdu bordBuffer Avaleurdu bordBuffer BRésultatZone <strong>de</strong> <strong>la</strong> gestion du bordÉlément structurantZone <strong>de</strong> <strong>la</strong> gestion du bordFIG. 8.6 : Exemple <strong>de</strong> <strong>la</strong> fusion <strong>de</strong>s valeurs <strong>de</strong>s buffers A et B lors <strong>de</strong> <strong>la</strong> phase p 3 <strong>pour</strong> un pixel dans <strong>la</strong> zoneintérieure <strong>de</strong> l’image et <strong>pour</strong> les pixels dans les zones touchant les bords <strong>de</strong> l’imagephase3Gen :: [Char] → Bro<strong>de</strong>rFnc→ I → (α → α → α) → ( Ar ( I , I ) α, Ar ( I , I ) α) → Ar ( I , I ) αphase3Gen dir brdfnc k f (buf A , buf B ) =listArray (bounds $buf A )◦ (map ( λ i → f ( sampGen brdfnc buf A (p 1 i ) )( sampGen brdfnc buf B (p 2 i ) ) ) )◦ indices$buf Awherep 1 (x 1 ,x 2 ) = if (how == "Fst" ) then (x 1 + div (k−1) 2, x 2 ) else (x 1 , x 2 + div (k−1) 2)p 2 (x 1 ,x 2 ) = if (how == "Fst" ) then (x 1 − (div (k−1) 2), x 2 ) else (x 1 , x 2 − (div (k−1) 2))Le paramètre dir spécifie <strong>la</strong> direction du segment (”Fst” ou ”Snd”) et <strong>la</strong> fonction brdf nc assurel’extraction <strong>de</strong>s valeurs <strong>pour</strong> les in<strong>de</strong>x à l’extérieur du domaine <strong>de</strong>s <strong>de</strong>ux buffers. k est le nombre <strong>de</strong>séléments constituant le segment et f est <strong>la</strong> fonction à effectuer (max ou min). Dans le cœur <strong>de</strong> cettefonction, nous créons le stream <strong>de</strong>s in<strong>de</strong>x ixs par <strong>la</strong> fonction indices du Haskell, nous procédons àl’échantillonnage <strong>de</strong>s <strong>de</strong>ux buffers à l’ai<strong>de</strong> <strong>de</strong> <strong>la</strong> fonction sampGen <strong>pour</strong> les positions décalées p 1 et p 2et nous appliquons ensuite <strong>la</strong> fonction f . La fonction listArray crée, d’une manière standard, un arrayà partir d’un stream <strong>de</strong>s résultats. Ainsi, nous obtenons une ligne (colonne) <strong>de</strong>s valeurs résultantes <strong>de</strong>l’opération morphologique.L’algorithme entier <strong>de</strong> van Herk-Gil-Werman que nous construisons à partir <strong>de</strong> ces trois phases et quitravaille avec les segments suivant l’axe <strong>de</strong> <strong>la</strong> première coordonnée (Fst) est présenté par l’algorithme 8.2en tant que fonction algoHGWFst. Notre intérêt <strong>pour</strong> cette première coordonnée sera éc<strong>la</strong>irci par <strong>la</strong> suitelors <strong>de</strong> <strong>la</strong> <strong>de</strong>scription <strong>de</strong> <strong>la</strong> version SIMD <strong>de</strong> cet algorithme. Notons que <strong>la</strong> spécification <strong>pour</strong> les segmentssuivant <strong>la</strong> direction <strong>de</strong> <strong>la</strong> <strong>de</strong>uxième coordonnée est analogue et peut être facilement dérivée à partir <strong>de</strong> <strong>la</strong>définition <strong>de</strong> <strong>la</strong> fonction algoHGWFst.L’algorithme HGW prend quatre arguments : k est <strong>la</strong> taille du segment symétrique, brdf nc est <strong>la</strong>fonction qui assure l’obtention <strong>de</strong> <strong>la</strong> valeur <strong>de</strong> l’extérieur du domaine <strong>de</strong> l’image lors d’échantillonnage<strong>de</strong>s buffers dans <strong>la</strong> phase p 3 , f est <strong>la</strong> fonction qui assure l’opération morphologique et ar est l’arrayd’entrée. Malgré <strong>la</strong> forme peu standard <strong>de</strong> cet algorithme, son fonctionnement n’est pas plus compliquéque ceux déjà rencontrés. Nous commençons par appliquer (sur <strong>la</strong> ligne 18) sur l’array ar le découpage,ligne 17, en colonnes composées <strong>de</strong>s éléments <strong>de</strong> base. Nous passons, ligne 16, d’un array à un flux <strong>de</strong>données (colonnes dans ce cas) et nous appliquons sur chaque colonne (ligne 6) un bloc <strong>de</strong> traitement(entre les lignes 7 et 14).Ce bloc fonctionnel est dédié à <strong>la</strong> construction <strong>de</strong>s buffer A et B. Il ne fait que découper chaquecolonne (ligne 14) en macro blocs <strong>de</strong> taille k du segment, exprime cette colonne en tant que flux <strong>de</strong>smacro blocs et applique sur chacun d’eux <strong>la</strong> phase1 et <strong>la</strong> phase2 <strong>de</strong> traitement par <strong>la</strong> propagation <strong>de</strong>s171

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!