<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 BRAMBORcelui <strong>pour</strong> les pixels. Un travail très différent surtout parce que nous aurions besoin d’introduire<strong>de</strong>s fonctions plus é<strong>la</strong>borées d’extraction <strong>de</strong>s pixels voisins (ordinaires) à partir d’un groupe quiserait <strong>de</strong> ce nouveau type. C’est <strong>pour</strong>quoi nous préférons introduire <strong>de</strong>s superpixels <strong>pour</strong> lesquelsnous pouvons utiliser, lors <strong>de</strong> <strong>la</strong> construction <strong>de</strong> nos algorithmes, <strong>la</strong> même charpente que celleutilisée <strong>pour</strong> les pixels ordinaires ; même si, bien sûr, nous aurons besoin <strong>de</strong> modifier certainspoints spécifiques.Remarquons que l’idée <strong>de</strong>s superpixels n’est pas restreinte uniquement aux arrays définis sur lesgrilles régulières mais peut être transposée au traitement général <strong>de</strong>s graphes. Pour ces <strong>de</strong>rniers, unsuperpixel serait défini comme un groupe <strong>de</strong>s sommets du graphe qui peuvent être traités en mêmetemps.4.4.5.1 Travail avec <strong>de</strong>s superpixelsLa position d’un superpixel dans l’array est définie par un in<strong>de</strong>x que nous allons appeler l’in<strong>de</strong>xd’ancrage. Sa valeur doit être incluse dans les bornes minimales et maximales <strong>de</strong> cet array. De plus,l’élément <strong>de</strong> l’array qui est désigné par l’in<strong>de</strong>x d’ancrage d’un superpixel doit appartenir au groupe <strong>de</strong>séléments constituant ce superpixel.La fonction d’échantillonnage <strong>de</strong>s superpixels décrit <strong>la</strong> manière dont les éléments d’un superpixelsont extraits à partir <strong>de</strong> l’image. Étant donné un array ar et l’in<strong>de</strong>x d’ancrage i d’un superpixel, les éléments<strong>de</strong> ce <strong>de</strong>rnier peuvent être obtenus par l’application d’une fonction concrète sampFncSP d’extraction<strong>de</strong> superpixels :sampFncSPariL’ensemble <strong>de</strong> tous les superpixels d’un array doit obligatoirement composer l’array entier. Le nombreprécis <strong>de</strong>s éléments composant un superpixel peut être variable d’un superpixel à l’autre. Deux cas spéciauxpeuvent être distingués, celui d’un superpixel composé d’un seul élément et celui d’un superpixelcomposé <strong>de</strong> tous les éléments d’un array. La définition exacte <strong>de</strong>s superpixels n’est pas restreinte pard’autres conditions, on n’exige pas une forme géométrique particulière ni que cette forme soit convexe.4.4.5.2 Sens du parcours, passage d’un array à un flux <strong>de</strong> superpixels et vice versaCependant, <strong>pour</strong> le travail pratique, il est préférable <strong>de</strong> définir <strong>de</strong>s superpixels d’une manière unifiéecomme <strong>de</strong>s ensembles d’éléments définissant le pavage <strong>de</strong> l’array aux zones rectangu<strong>la</strong>ires <strong>de</strong> mêmesdimensions dans lesquelles nous choisissons par convention les in<strong>de</strong>x les plus petits comme les in<strong>de</strong>xd’ancrage. La figure 4.8 illustre cette situation.fstsndin<strong>de</strong>x d’ancragearraysuperpixeli 1 i 2 i 3 i 4 i 5i 6 i 7 i 8 i 9 i 10FIG. 4.8 : Décomposition d’un array aux superpixels rectangu<strong>la</strong>ires <strong>de</strong> mêmes dimensionsDans ce but, nous définissons <strong>la</strong> fonction streamAr2DSP du sens du parcours <strong>pour</strong> les superpixels quinous retourne un stream <strong>de</strong>s in<strong>de</strong>x d’ancrage <strong>de</strong>s superpixels et dont le fonctionnement est très semb<strong>la</strong>bleà celui <strong>de</strong> <strong>la</strong> fonction streamAr2D, page 72 :74
Jaromír BRAMBOR4.4. PRIMITIVES DU CALCUL COMME SKELETONS ALGORITHMIQUESstreamAr2DSP :: [Char] → I → I → Ar ( I , I ) α → [ ( I , I ) ]streamAr2DSP how m n ar| how == "FWFst" = [ ( flo +m∗ i ,slo+n ∗ j ) | j ←[0 .. smax], i←[0 .. fmax] ]| how == "FWSnd" = [ ( flo +m∗ i ,slo+n ∗ j ) | i←[0 .. fmax], j ←[0 .. smax]]| how == "BWFst" = [ ( fhi −m∗i,shi−n∗j ) | j ←[0 .. smax], i←[0 .. fmax] ]| how == "BWSnd" = [ ( fhi −m∗i,shi−n∗j ) | i←[0 .. fmax], j ←[0 .. smax]]where( ( flo ,slo) , ( fhi ,shi ) ) = bounds $ ar ;fmax = div (rangeSize(flo,fhi)−1) msmax = div (rangeSize(slo,shi)−1) nLe premier argument est <strong>la</strong> clé avec <strong>la</strong>quelle nous désignons <strong>la</strong> fonctionnalité exacte <strong>de</strong> cette fonction.Le <strong>de</strong>uxième / troisième argument <strong>de</strong> cette fonction désigne les dimensions d’un superpixel dans <strong>la</strong>première/<strong>de</strong>uxième coordonnée. Le quatrième paramètre est l’array d’entrée que nous voulons parcourir.Nous définissons le type StreamizeSP qui va désigner <strong>de</strong>s fonctions <strong>pour</strong> le passage d’un array à unstream <strong>de</strong>s in<strong>de</strong>x d’ancrage <strong>de</strong>s superpixels. La signature <strong>de</strong> ce type est, en effet, i<strong>de</strong>ntique aux fonctionsdésignées par le type Streamize. Tandis que les fonction étant du type Streamize travaillent avec lesin<strong>de</strong>x ordinaires, le type StreamizeSP porte, <strong>de</strong> plus, une information syntactique du type <strong>de</strong> retour[(I, I)], car nous le définissons comme <strong>la</strong> liste <strong>de</strong>s in<strong>de</strong>x d’ancrage <strong>de</strong>s superpixels :type StreamizeSP α = Ar ( I , I ) α → [ ( I , I ) ]Ainsi, <strong>la</strong> signature <strong>de</strong> type <strong>de</strong> <strong>la</strong> fonction streamAr2DSP que nous venons <strong>de</strong> présenter :streamAr2DSP :: [Char] → I → I → Ar ( I , I ) α → [ ( I , I ) ]peut être récrite comme :streamAr2DSP :: [Char] → I → I → StreamizeSPαAyant obtenu un stream <strong>de</strong>s in<strong>de</strong>x d’ancrage par <strong>la</strong> fonction streamAr2DSP, nous avons encorebesoin <strong>de</strong>s fonctions qui extrairaient à partir <strong>de</strong> ce stream les éléments <strong>de</strong> bases <strong>de</strong> l’image qui composentles superpixels correspondants. Ces fonction seront du type SampFncSP :SampFncSPα ::( Ix β) ⇒ Ar β α → β → [α]et elle diffèrent <strong>de</strong>s versions c<strong>la</strong>ssiques (non-superpixeliques) <strong>de</strong>s fonctions d’échantillonnage dans letype <strong>de</strong> retours qui est dans ce cas une liste <strong>de</strong>s éléments.Ce procédé est assuré, dans <strong>la</strong> version générale, par <strong>la</strong> fonction sampSPGen. Elle va nous retourner,<strong>pour</strong> un in<strong>de</strong>x d’ancrage donné, <strong>la</strong> liste <strong>de</strong> tous les éléments <strong>de</strong> l’array appartenant au superpixel qui estdésigné par cet in<strong>de</strong>x.sampSPGen :: I → I → Ar ( I , I ) α → ( I , I ) → [α]sampSPGen m n ar ( ixf ,ixs ) = map (ar ! ) ( range((ixf ,ixs ) , ( ixf +m−1, ixs+n−1)) )Notons que <strong>la</strong> signature <strong>de</strong> type <strong>de</strong> cette fonction est compatible avec celle qui utilise le type SampFncSP :sampSPGen :: I → I → SampFncSPαet nous pouvons l’utiliser, après l’application partielle <strong>de</strong> ses <strong>de</strong>ux premiers paramètres, comme <strong>la</strong> fonctiond’entrée dans les algorithmes exigeants les fonction du type SampFncSP.Nous utiliserons encore une autre catégorie <strong>de</strong> fonctions qui est connexe aux superpixels et qui serautilisée lors <strong>de</strong> <strong>la</strong> recomposition <strong>de</strong> l’array <strong>de</strong> sortie. Il s’agit <strong>de</strong>s fonctions qui, à partir d’un tuple composé<strong>de</strong> l’in<strong>de</strong>x d’ancrage et <strong>de</strong> <strong>la</strong> liste <strong>de</strong>s éléments résultants d’un superpixel, créent <strong>la</strong> liste <strong>de</strong>s tuples(in<strong>de</strong>x, élément). Cette <strong>de</strong>rnière liste sera utilisée dans les algorithmes comme un moyen <strong>pour</strong> pouvoirrecomposer le stream d’entrée <strong>de</strong> <strong>la</strong> fonction standard array <strong>de</strong> Haskell afin <strong>de</strong> créer l’array <strong>de</strong> sortie.Ces fonctions seront du type ZipSP :type ZipSP α = ( ( I , I ) , [α]) → [ ( ( I , I ) , α)]La fonction qui sera <strong>de</strong> cette catégorie, qui complète le passage au flux <strong>de</strong> superpixels, comme définipar <strong>la</strong> fonction StreamAr2DSP et leur extraction, comme défini par <strong>la</strong> fonction sampSPGen, c’est <strong>la</strong>fonction zipSPGen75