<strong>Algorithmes</strong> <strong>de</strong> <strong>la</strong> <strong>morphologie</strong> <strong>mathématique</strong> <strong>pour</strong> les architectures orientées fluxJaromír BRAMBORPrésentons alors un exemple concret. Le premier que nous décrivons est l’algorithme <strong>de</strong> <strong>la</strong> di<strong>la</strong>tationmorphologique sur <strong>la</strong> grille carrée par l’élément structurant ngbSQR4. La fonction dilSQRSIMD décritun algorithme qui utilise <strong>la</strong> fonction générale d’extraction du voisinage <strong>pour</strong> <strong>la</strong> grille carrée et <strong>pour</strong>l’échantillonnage général (sampGen) qui travaille avec <strong>la</strong> fonction <strong>de</strong> traitement du bord cBor<strong>de</strong>r rendantune valeur constante <strong>pour</strong> tous les éléments du bord.dilSQRSIMD :: (Ordα) ⇒ (PVec I α) → Ngb → Ar ( I , I ) (PVec I α) → Ar ( I , I ) (PVec I α)dilSQRSIMD brdval ngbs ar = ngbAlgoSIMDindices(extrNgbSQRSIMD how n (sampGen ( cBor<strong>de</strong>r brdval ) ) ngbs)ngbDi<strong>la</strong>tearwhere n = rangeSize◦bounds$(ar!lo); (lo,hi) = bounds arD’autres fonctions peuvent être construites en utilisant le schéma présenté. En se basant sur un autreskeleton algorithmique, en choisissant <strong>la</strong> fonction d’extraction du voisinage, d’échantillonnage ou <strong>de</strong>traitement <strong>de</strong>s bords appropriée et en choisissant <strong>la</strong> fonction du kernel <strong>de</strong> l’opération morphologique,nous pouvons dériver les implémentations <strong>de</strong>s opérations morphologiques <strong>de</strong> base adaptées à un cas particulierd’utilisation, notamment les opérations sur les grilles hexagonales et <strong>la</strong> métho<strong>de</strong> plus complexe<strong>de</strong> gestion <strong>de</strong>s bords (i.e. par réflexion <strong>de</strong>s bords).5.2.3 <strong>Algorithmes</strong> SIMD basés sur l’approche <strong>de</strong>s superpixelsNotre idée <strong>de</strong> travail avec les vecteurs paquetés peut également être transposée à l’approche <strong>de</strong>ssuperpixels. Dans ce cas, les superpixels ne seront pas constitués <strong>de</strong>s éléments <strong>de</strong> base mais <strong>de</strong>s vecteurspaquetés.unaLoadunaLoad(0,0) (0,1) (0,2)(0,1)A(0,1)(0,1)Bop3( , , )(1,0)(2,0)(1,1)(2,1)(1,2)(2,2)(1,1)A(2,1)A(1,1)(2,1)(1,1)B(2,1)Bop3( , , )op3( , , )op2( , )op2( , )op2( , )(1,1)(2,1)(3,0) (3,1) (3,2)(4,0) (4,1) (4,2)(3,1)A(4,1)A(3,1)(4,1)(3,1)B(4,1)Bop3( , , )op3( , , )op2( , )op2( , )op2( , )(3,1)(4,1)(2n,0) (2n,1) (2n,2)(2n,1)A(2n,1)(2n,1)Bop3( , , )op2( , )op2( , )(2n,1)(2n+1,0) (2n+1,1) (2n+1,2)(2n+1,1)(2n+1,1) (2n+1,1)ABop3( , , )FIG. 5.12 : Fonctionnement du kernel traitant un superpixel SIMD en 8-voisinageSi nous étudions <strong>la</strong> transposition <strong>de</strong> cette idée plus en détail, nous nous apercevons que nous avonsrecours, lors <strong>de</strong> l’extraction <strong>de</strong>s voisins d’un superpixel, au même phénomène que celui que l’on a purencontrer lors <strong>de</strong> l’extraction <strong>de</strong>s voisins d’un vecteur paqueté et qui nous a mené à l’utilisation <strong>de</strong>slectures non-alignées <strong>de</strong>s données vectorielles <strong>de</strong> <strong>la</strong> mémoire.La figure 5.12 illustre cette situation sur le traitement SIMD d’un superpixel <strong>pour</strong> l’élément structurantdéfinissant le voisinage avec 8 voisins sur <strong>la</strong> grille carrée. Elle diffère, par rapport à <strong>la</strong> figure 5.9 quiassure <strong>la</strong> même opération morphologique sur les GPP, dans l’utilisation <strong>de</strong>s vecteurs paquetés à <strong>la</strong> p<strong>la</strong>ce<strong>de</strong>s éléments <strong>de</strong> base et surtout dans <strong>la</strong> présence <strong>de</strong>s opérations <strong>de</strong> lecture non alignée, représentée par114
Jaromír BRAMBOR5.3. ALGORITHMES GÉODÉSIQUES POUR LES GPP/GPPMMles blocs unaLoad. Notons que <strong>pour</strong> ce cas particulier où nous connaissons a priori <strong>la</strong> définition exacte <strong>de</strong>l’élément structurant, nous n’utilisons pas <strong>la</strong> lecture non alignée <strong>pour</strong> l’extraction <strong>de</strong>s vecteurs paquetéscentraux mais nous l’utilisons uniquement <strong>pour</strong> l’extraction <strong>de</strong>s voisins <strong>de</strong> ces <strong>de</strong>rniers. Ces voisins sontdénotés dans l’image par les in<strong>de</strong>x A et B.D’autres schémas <strong>de</strong> travail avec les superpixels SIMD peuvent être dérivés, notamment ceux <strong>pour</strong>le travail avec le 4 pixels voisins sur <strong>la</strong> grille carrée, cf. sa version sca<strong>la</strong>ire sur <strong>la</strong> fig. 5.10, page 111, et<strong>pour</strong> le travail avec 6 voisins sur <strong>la</strong> grille hexagonale, cf. sa version sca<strong>la</strong>ire sur <strong>la</strong> fig. 5.11, page 112.Algorithme 5.8 : ngbAlgoGenSPSIMD, skeleton algorithmique généralisé <strong>de</strong> travail sur le voisinage<strong>pour</strong> les superpixels1 ngbAlgoGenSPSIMD :: [StreamizeSP(PVecI α)] → [ExtrNgbSP(PVec I α)]2 → [NgbOpSP (PVec I α)] → [ZipSP(PVec I α)]3 → Ar ( I , I ) (PVec I α) → Ar ( I , I ) (PVec I α)4 ngbAlgoGenSPSIMD = ngbAlgoGenSPLa formalisation <strong>de</strong> l’approche <strong>de</strong>s superpixels SIMD travail<strong>la</strong>nt avec les types <strong>de</strong>s vecteurs paquetéssuit <strong>la</strong> même logique que celle employée <strong>pour</strong> les algorithmes élémentaires. Nous reprenons le skeletonalgorithmique ngbAlgoGenSP (défini par l’algortihme 5.4) et nous spécialisons sa forme générique <strong>pour</strong>le type polymorphe <strong>de</strong> vecteurs paquetés PVec I α en tant que fonction ngbAlgoGenSPSIMD, définiepar l’algorithme 5.8.5.3 <strong>Algorithmes</strong> géodésiques <strong>pour</strong> les GPP/GPPMM5.3.1 Idée <strong>de</strong> baseLe traitement géodésique constitue un type <strong>de</strong> traitement <strong>de</strong> base <strong>de</strong> <strong>la</strong> <strong>morphologie</strong> <strong>mathématique</strong>.On désigne une opération comme opération morphologique géodésique si le traitement est effectué d’unemanière itérative, si nous pouvons y percevoir une propagation <strong>de</strong>s valeurs et si cette propagation estrestreinte lors d’enchaînement <strong>de</strong>s itérations par une fonction, exprimée le plus souvent en tant qu’imagedu masque. Citons comme exemple Ser00 <strong>la</strong> définition <strong>de</strong> <strong>la</strong> di<strong>la</strong>tation δ géodésique <strong>de</strong> taille unité (donnépar l’élément structurant B) <strong>de</strong> <strong>la</strong> fonction g restreinte par <strong>la</strong> fonction f :δ f (g) = inf(g + B, f) (5.1)nous travaillons à l’échelle <strong>de</strong>s fonctions, c’est-à-dire à l’échelle <strong>de</strong>s images entières. Si on suivait cesdéfinitions, <strong>la</strong> restriction, représentée dans notre exemple par <strong>la</strong> fonction inf, <strong>de</strong>vrait opérer sur les images.Pour les raisons <strong>de</strong> performance, il est préférable d’imposer <strong>la</strong> restriction sur <strong>la</strong> propagation déjàdans le kernel du calcul <strong>de</strong> l’opération sur le voisinage qui travail à l’échelle <strong>de</strong>s éléments <strong>de</strong> l’array.Ainsi, nous pouvons construire un kernel d’une fonction morphologique géodésique à condition quenous puissions introduire <strong>la</strong> valeur restrictive (valeur du masque correspondant au pixel traité) commeun paramètre supplémentaire dans <strong>la</strong> fonction définissant le kernel.Nous allons nous appuyer sur les kernels géodésiques <strong>de</strong>s opérations sur le voisinage. Nous avonsprésenté <strong>la</strong> forme formelle <strong>pour</strong> ces kernels dans <strong>la</strong> section 4.6.6, page 94. Elle sera représentée dansnos algorithmes par les fonctions du type NgbGOp. De plus, nous <strong>de</strong>vons également gérer dans cesalgorithmes l’extraction <strong>de</strong> <strong>la</strong> valeur du masque. Pour cette extraction, nous allons nous appuyer sur <strong>la</strong>même fonction du parcours <strong>de</strong>s stream que celle utilisée <strong>pour</strong> l’image même. Mais il nous faut spécifierune fonction d’échantillonnage <strong>de</strong>s éléments d’un array à partir d’un in<strong>de</strong>x qui est du type SampFnc etqui sera utilisée <strong>pour</strong> obtenir <strong>la</strong> valeur concrète du masque <strong>pour</strong> un in<strong>de</strong>x concret.Remarquons que <strong>pour</strong> extraire correctement les éléments qui se correpon<strong>de</strong>nt dans l’image et dansle masque, les dimensions <strong>de</strong> ces <strong>de</strong>ux arrays doivent être obligatoirement les mêmes. L’algorithme 5.9115