Vexillologie et segmentation

Vexillologie et segmentation

Quelques mots sur la vexillologie

Peu utilisé au quotidien, le terme "vexillologie" représente l'étude (logos) des drapeaux (vexillium), à ne pas confondre avec la vexillophilie qui est le fait de collectionner des drapeaux, étendards ou pavillons. Science sérieuse quoique de prime abord étonnante pour le béotien,  elle vise à créer et développer un ensemble de connaissances autour des types de drapeaux, de leurs formes, de leurs couleurs et de leurs motifs, ainsi qu'autour de leurs fonctions. Elle a aussi pour but de bâtir des théories et des principes basés sur ces connaissances. Pour cela, la Fédération internationale des associations vexillologiques (FIAV) regroupe 52 associations et institutions vexillologiques régionales, nationales et multinationales ; elle a pour but de :

  • créer des liens entre les associations et institutions et d'encourager et coordonner leurs travaux, études et recherches ;
  • promouvoir l'organisation du Congrès International de Vexillologie et d'apporter son aide aux organisateurs ;
  • encourager la création dans tous les pays d'associations et d'institutions dédiées à la vexillologie ;
  • mettre en place des standards internationaux pour faciliter le développement de ces activités.

Comment segmenter des drapeaux en termes de couleur ?

Dans cet article, je m'intéresse aux 199 drapeaux nationaux de la base flagpedia sous un angle colorimétrique afin de fournir simplement et automatiquement :

  • une décomposition en bandes verticales des couleurs contenues dans chacun des drapeaux, afin de faciliter leur comparaison ;
  • une segmentation de ces drapeaux à partir de ces décompositions, dans l'espoir de les rassembler automatiquement par couleur dominante.

Certes, ceci est un grain de sable apporté à l'édifice de la vexillologie. Mais pour autant, le but n'est pas tant de devenir vexillologue en un billet de blog que de présenter et manipuler des méthodes d'analyse des données afin de proposer une première solution - simple - au problème posé. Le problème choisi est bien là pour fournir des données intéressantes afin d'illustrer les méthodes, et non l'inverse.

Sur ce, on est parti !

La boîte à outils

Tout d'abord, faisons la liste des outils essentiels qui m'ont permis de mener l'étude. On y trouve :

  • le logiciel R couplé à l'interface R Studio pour l'analyse et le traitement des données ;
    • Le logiciel et langage de programmation R est mon outil de travail principal pour la manipulation des données. Il est très présent dans le monde académique et de plus en plus dans celui industriel, du fait notamment de son côté libre (licence GNU GPL) et de l'abondance des méthodes qu'il implémente (merci au passage à la communauté de l'enrichir au quotidien via des librairies suivant de près les avancées technologiques et méthodologiques !).
  • la librairie XML pour la récupération des données vexillologiques ;
    • L'eXtensible Markup Language (noté XML et traduisible par « langage de balisage extensible) est un métalangage informatique de balisage générique facilitant l'échange automatisé de contenus complexes (arbres, texte riche, ...) entre des systèmes d'informations hétérogènes.  Sa syntaxe est dite « extensible » car elle permet de définir différents espaces de noms, c'est-à-dire des langages avec chacun leur vocabulaire et leur grammaire, comme XHTML, XSLT, RSS, SVG… Elle est reconnaissable par son usage des chevrons (< >) encadrant les balises. Nous nous en servons ici pour récupérer et transformer automatiquement le contenu d'une page Web de syntaxe HTML en un objet R.
  • la librairie raster pour l'affichage des images au format PNG ;
    • La librairie raster fournit des classes et des fonctions afin de manipuler des données géographiques (spatialees) dans le format raster. Le format raster divise l'espace en cellules (rectangles, pixels, ...) de tailles égales (en unité du système de référence de coordonnées). De telle données spatiales continues peuvent aussi être vues comme des données "projetées sur une grille", et différenciées des données spatiales discrètes basées sur des objets (points, lignes, polygones, ...).  Cette librairie peut être très utile lors de la manipulation de gros jeux de données ne pouvant pas être chargés dans la mémoire de l'ordinateur. Les fonctions s'exécuteront ainsi normalement, car elles manipulent les fichiers en plusieurs fois, c'est-à-dire en lisant, traitant puis écrivant des blocs de données, sans que l'ensemble des données des fichiers ne soit chargé en même temps.
  • la librairie png pour la lecture des images au format PNG ;
    • La librairie png fournit un moyen simple et rapide de lire, écrire et afficher des images bitmap stockées dans le format PNG. Elle permet de lire et écrire tant des fichiers que des vecteurs de données brutes présentes dans la mémoire vive.
  • la fonction kmeans de la librairie stats (librairie native) pour l'utilisation de la méthode des k-moyennes.
    • Cette fonction implémente la méthode des k-moyennes, outil central de l'étude. À ce titre, la section suivante lui est réservée.

La méthode des k-moyennes

La méthode des k-moyennes (k-means en anglais) est à la fois une méthode de partitionnement de données et un problème d'optimisation combinatoire. Pour un jeu de n observations donné (x_1,x_2,\ldots,x_n), où chaque observation x_i est un vecteur de dimension d, elle crée une partition de ces n observations en k groupes (souvent appelés clusters) G=\{G_1,G_2,\ldots,G_k\} de sorte à minimiser la somme des distances de chaque point d'un groupe à son centre. D'un point de vue mathématique, on cherche la partition G minimisant la fonction objectif :

f(G)=\sum_{i=1}^k\sum_{x\in G_i}\text{distance}(x,\mu_i)^2

\mu_i est le centre du groupe G_i défini par la moyenne des observations de ce groupe :

\mu_i=\frac{1}{\text{Card}(G_i)}\sum_{x\in G_i}x.

Remarque : La distance la plus classique est la distance euclidienne ; sa simplicité m'amène à la retenir dans cette première étude. La fonction objectif s'écrit alors f(G)=\sum_{i=1}^k\sum_{x\in G_i}\|x-\mu_i\|_2^2.

La recherche de la partition optimale G minimisant la fonction objectif f donne lieu à un algorithme d'optimisation classique :

  • Soit k le nombre de groupes.
  • Soit (\mu_1^{(1)},\mu_2^{(1)},\ldots,\mu_k^{(1)}) les centres initiaux des k groupes G^{(t)}=(G_1^{(t)},\ldots,G_k^{(t)}).
  • Itérer les deux étapes suivantes jusqu'à convergence de l'algorithme :
    • Étape d'affectation : à l'itération t, associer à chaque observation x le groupe dont la moyenne minimise la somme des carrés intra-groupe, c'est-à-dire :

      S_i^{(t)}=\{x_j:\|x_j-\mu_i^{(t)}\|\leq\|x_j-\mu_{i^*}^{(t)}\|\}, \forall i^*\in\{1,\ldots,k\}

    • Étape de mise-à-jour : à l'itération t, mettre à jour la moyenne de chaque groupe, c'est-à-dire :

      \mu_i^{(t+1)}=\frac{1}{\text{Card}(G_i^{(t)})}\sum_{x\in G_i^{(t)}}x.

Deux questions apparaissent à la lecture de cet algorithme :

  • comment choisir les centres initiaux pour un nombre de groupes k donné ?
  • comment choisir le nombre de groupes k ?

Si ces deux questions sortent du cadre introductif à la méthode des k-moyennes que je souhaite aborder dans cet article, quelques pistes de réponses s'imposent malgré tout.

Concernant les centres initiaux, une première approche consiste à choisir au hasard k observations parmi les n à notre disposition et de les considérer comme les centres initiaux. Une deuxième consiste à affecter au hasard un groupe à chacune des n observations puis à calculer la moyenne de chacun de ces groupes. La première approche a tendance à "étaler" les centres de groupes tandis que la deuxième favorise leur proximité au centre des n observations. Une troisième approche consiste à choisir un premier centre au hasard parmi les n observations puis à tirer de façon aléatoire et itérative les k-1 autres centres parmi les observations restantes en affectant à chaque observations une probabilité de sélection proportionnelle à la distance la séparant des centres déjà retenus ; ainsi, pour le j^{\text{eme}} centre, une observation aura d'autant plus de chance d'être retenue que sa distance aux centres (\mu_1^{(1)},\ldots,\mu_{j-1}^{(1)}) est importante.

Concernant le choix du nombre de groupes k, plusieurs méthodes plus ou moins complexes et plus ou moins "savantes" existent dans la littérature. Je ne les présente pas ici, préférant donner l'idée générale qu'elles renferment :

  • minimiser la somme des carrés des distances séparant les points d'un groupe à son centre, tout en
  • maximisant la somme des carrés des distances séparant les centres les uns des autres.

On parle également de minimiser la variance intra-groupe tout en maximisant la variance inter-groupe. Autrement dit, on cherche à avoir des observations les plus semblables possibles au sein d'un même groupe tout en ayant des groupes les plus distincts possibles.

L'implémentation de l'étude sous R

À présent que l'on connait l'objectif de l'étude (décomposer chaque drapeau en terme de couleur et segmenter l'ensemble des drapeaux selon leur couleur dominante), les outils retenus (logiciel R, les librairies XML, png, raster et stats) et la méthode de traitement des données considérée (les k-moyennes), nous allons pouvoir implémenter l'étude sous R.

Tout d'abord, en supposant que l'on est dans le bon répertoire de travail (sinon, l'utilisation de la fonction setwd est conseillée !), on charge les librairies dont on a besoin.

# Chargement des librairies
library(RCurl),library(XML),library(raster),library(png)

Puis, on se rend sur le site de flagpedia afin de récupérer nos drapeaux. Comme vous pouvez le voir dans le code, la librairie XML intervient à ce moment en définissant des critères permettant de consulter une page HTML et d'en extraire les informations pertinentes, en parcourant les balises qu'elle laisse sur son passage. Plus précisément, on s'intéresse aux URL des images de drapeaux (critère "//img/@src") et aux noms des pays associés à ces drapeaux (critère "//td[@class='td-country']//text()").

# URL à parcourir pour récupérer automatiquement les données sur flagpedia.net
html <- getURL("http://flagpedia.net/index", followlocation = TRUE)
# Analyse du fichier HTML associé
doc <- htmlParse(html, asText=TRUE)
# Récupération des pays listés dans le fichier HTML selon un critère d'accès au noeud XML
criterion <- "//td[@class='td-country']//text()"
countries <- xpathSApply( doc,criterion,xmlValue)
# Récupération des pays listés dans le fichier HTML selon un critère d'accès au noeud XML
criterion <- "//img/@src"
urls <- xpathSApply( doc,criterion)
# Libération de la mémoire associé à l'objet "doc"
free(doc)
# Réécriture des URLs des images en remplaçant "mini" (miniature de l'image) par "normal"
urls <- gsub("mini","normal",urls)
# Rajout du radical "http:" manquant dans les URLs récupérées précédemment
urls <- sapply(urls,function(x){paste0("http:",x)})
# Téléchargements des images et sauvegardes sous la forme flag1.png, flag2.png, ...
n_countries <- length(urls)
for(i in 1:n_countries){
  download.file(urls[i],paste0("flag",i,".png"),mode="wb")
}

On obtient ainsi 199 images de drapeaux au format PNG nommées flag1.png, flag2.png, ... dans notre répertoire de travail, ainsi qu'une variable countries qui est le vecteur des noms de pays associés. Nous avons dès lors la base pour extraire les couleurs de chaque drapeau. On applique pour cela la méthode des k-moyennes à chaque image après avoir pris soin de la "matricialiser", c'est-à-dire d'avoir transformé le tableau à trois dimensions (dimension 1 = largeur ; dimension 2 = hauteur ; dimension 3 = niveaux de rouge, de vert et de bleu) la représentant en une matrice dont chaque ligne représente un pixel et dont les trois colonnes représentent les niveaux de rouge, de vert et de bleu. En effet, le choix arbitraire a été fait de représenter les couleurs avec la palette RGB (Red Green Blue) mais d'autres pourraient être considérées.

Nmax <- 10 # Nombre maximal de clusters souhaité
n_samples <- 1000 # Nombre d'échantillons pour l'initialisation de kmeans
flag_colors <- list() # Ensemble des couleurs par drapeau
flag_clusters <- list() # Ensemble des clusters de chaque pixel pour chaque drapeau
flag_cluster_sizes <- list() # Taille des clusters par drapeau
# On effectue une segmentation par la méthode des k-moyennes pour chaque drapeau
for(i in 1:n_countries){
  # Lecture et vectorisation de l'image
  img <- readPNG(paste0("flag",i,".png"))[,,1:3]
  img_vect <- matrix(img,ncol=3)
  # Initialisation des centroïdes en prenant Nmax pixels uniques les plus distants possibles
  unique_pixels <- unique(img_vect,margin=1)
  random_unique_pixels <- list()
  distance_bt_rus <- c()
  for(j in 1:n_samples){
    random_unique_pixels[[j]] <- unique_pixels[sample(1:nrow(unique_pixels),min(nrow(unique_pixels),Nmax)),]
    aux <- dist(random_unique_pixels[[j]]) if(length(aux)>1){distance_bt_rus[j]=var(aux)}else{distance_bt_rus[j] <- aux}
  }
  flag_init_clusters <- random_unique_pixels[[which.max(distance_bt_rus)]]
  # Segmentation par la méthode des k-moyennes
  temp <- kmeans(img_vect,centers = flag_init_clusters)
  flag_colors[[i]] <- temp$centers
  flag_clusters[[i]] <- temp$clust
  flag_cluster_sizes[[i]] <- temp$size
}

Pour chaque drapeau indicé par i, on obtient ainsi trois variables :

  • flag_colors[[i]] : une matrice où chaque ligne est un centre de groupe et où les trois colonnes représentent la décomposition RGB de la couleur associée à ce groupe ;
  • flag_clusters[[i]] : un vecteur associant à chaque pixel l'indice de son groupe ;
  • flag_cluster_size[[i]] : un vecteur associant à chaque groupe le nombre de pixels associés.

On crée par la suite pour chaque pays une image représentant à la fois le drapeau correspondant et sa décomposition selon les couleurs dominantes représentées par les centres de la méthode des k-moyennes précédemment utilisée.

flag_colors_M <- matrix(0,n_countries,Nmax*3) # lignes = drapeaux ; colonnes = rgb(1) rgb(2) ...
flag_ratios_M <- matrix(0,n_countries,Nmax) # lignes = drapeaux ; colonnes = proportions associées aux rgb(i)
# les rgb et les proportions sont classées par ordre décroissant des ratios.
for(j in 1:n_countries){
  r <- as.matrix(flag_cluster_sizes[[j]]/sum(flag_cluster_sizes[[j]]))
  temp <- sort(r,index.return=TRUE,decreasing=TRUE)
  flag_colors_M[j,1:(3*length(flag_cluster_sizes[[j]]))] <- sapply(1:length(flag_cluster_sizes[[j]]),function(i){flag_colors[[j]][temp$ix[i],]})
  flag_ratios_M[j,1:length(flag_cluster_sizes[[j]])] <- temp$x
}

flag_plot <- function(C,r,countries,i){
  N <- sum(r[i,]!=0)
  plot(c(0,1.5),c(0,1),xaxt="n",yaxt="n",xlab="",ylab="",type="n",main=paste(countries[i]," flag colors"))
  rect(0,0,sqrt(r[i,1])/sum(sqrt(r[i,]))*1.5,1,col=rgb(C[i,1],C[i,2],C[i,3]),border=rgb(C[i,1],C[i,2],C[i,3]))
  for(j in 2:N){
    rect(sum(sqrt(r[i,seq(1,j-1)]))/sum(sqrt(r[i,]))*1.5,0,sum(sqrt(r[i,seq(1,j)]))/sum(sqrt(r[i,]))*1.5,1,col=rgb(C[i,(3*(j-1)+1)],C[i,(3*(j-1)+2)],C[i,(3*(j-1)+3)]),border=NULL)
  }
}

for(i in 1:n_countries){
  png(paste0("colors/flag",i,"_colors.png"),width=480,height=480)
  op <- par(mar = rep(1, 4),bg=rgb(0.9,0.9,0.9));
  split.screen(c(2,1))
  screen(1);
  img <- readPNG(paste0("flag",i,".png"))[,,1:3]
  plot(c(0,1.5),c(0,1), type='n',xaxt="n",yaxt="n",xlab="",ylab="",main=paste("Flag of",countries[i]))
  rasterImage(img, 0, 0, 1.5, 1)
  screen(2);
  flag_plot(flag_colors_M,flag_ratios_M,countries,i)
  close.screen(all.screens = TRUE)
  par(op)
  dev.off()
}

La première étape est terminée : nous avons transformé les drapeaux en drapeaux à bandes verticales où chacune d'elle représente une couleur dominante. Les images sont stockées dans le dossier colors sous les noms flag1_colors.pngflag2_colors.png, ...

À présent, on cherche à regrouper de façon automatique les drapeaux selon leur première couleur dominante. Il suffit pour cela d'appliquer une nouvelle fois la méthode des k-moyennes, à ceci près que cette fois-ci, l'objet considéré est la matrice des observations de la première couleur dominante obtenue précédemment pour chaque drapeau. Autrement dit, chaque ligne de la matrice est un drapeau et ses trois colonnes représentent la décomposition RGB de la couleur en question. Les drapeaux sont ainsi regroupés par groupe, groupes qui sont sauvegardés sous forme d'images group1.pnggroup2.png, ... dans le dossier groups_c.

temp <- matrix(0,19,2)
for(i in 2:20){
  aux <- kmeans(flag_colors_M[,1:3],centers=i,nstart=10000)
  temp[i-1,] <- c(aux$tot.withinss,aux$betweenss)
}
matplot(temp,type="b",pch=19)
plot(temp[,1]/temp[,2],type="b",pch=19)
N = 7
temp <- kmeans(flag_colors_M[,1:3],centers=N,nstart=10000)
groups_c <- lapply(1:N,function(i){which(temp$cluster==i)})
sapply(1:N,function(i){print(length(groups_c[[i]]))})
for(k in 1:length(groups_c)){
  png(paste0("groups_c/group",k,".png"),width=720,height=480)
  nx <- ceiling(sqrt(length(groups_c[[k]])))
  ny <- ceiling(length(groups_c[[k]])/ceiling(sqrt(length(groups_c[[k]]))))
  op <- par(bg=rgb(0.9,0.9,0.9))
  plot(c(1,nx+1),c(1,ny+1), type = "n", xlab = "", ylab = "",xaxt="n",yaxt="n")
  for(i in 1:nx){
    for(j in 1:ny){
      if((i-1)*ny+j<=length(groups_c[[k]])){
        img <- readPNG(paste0("flag",groups_c[[k]][(i-1)*ny+j],".png")) 
        rasterImage(img, i+0.05, j+0.05, i+1-0.05, j+1-0.05)
     }
   }
 }
 par(op)
 dev.off()
}

Pour finir, un petit supplément aux deux questions posées en début d'article : que se passe-t-il si au lieu de segmenter les drapeaux selon la couleur dominante, on les segmente selon la proportion de pixels dans chaque groupe issu de la première application de la méthode des k-moyennes ? De façon plus claire, nous allons appliquer une dernière fois cette méthode de segmentation à la matrice dont la ligne i représente le ième drapeau et où la jème colonne représente la proportion de la jème couleur du ième drapeau. Derrière cette question opaque se trouvent des questions plus transparentes comme "à quoi ressemblent les drapeaux ayant trois couleurs, une première présente sur 50% des pixels, une deuxième sur 25% et une troisième elle aussi sur 25% ?".

temp <- matrix(0,19,2)
for(i in 2:20){
  aux <- kmeans(flag_ratios_M,centers=i,nstart=10000)
  temp[i-1,] <- c(aux$tot.withinss,aux$betweenss)
  print(i)
}
matplot(temp,type="b",pch=19)
plot(temp[,1]/temp[,2],type="b",pch=19)
N = 7
temp <- kmeans(flag_ratios_M,centers=N,nstart=10000)
groups_r <- lapply(1:N,function(i){which(temp$cluster==i)})
sapply(1:N,function(i){print(length(groups_r[[i]]))})
split.screen(c(3,3))
for(i in 1:7){screen(i);pie(temp$centers[i,],main=paste0(i,"ème cluster"))}
close.screen(all.screens = TRUE)
barplot(matrix(sapply(1:7,function(i){temp$center[i,]}),ncol=7),horiz=TRUE,beside=FALSE,names.arg=paste0("G",1:7))
for(k in 1:length(groups_r)){
  png(paste0("groups_r/group",k,".png"),width=720,height=480)
  nx <- ceiling(sqrt(length(groups_r[[k]])))
  ny <- ceiling(length(groups_r[[k]])/ceiling(sqrt(length(groups_r[[k]]))))
  op <- par(bg=rgb(0.9,0.9,0.9))
  plot(c(1,nx+1),c(1,ny+1), type = "n", xlab = "", ylab = "",xaxt="n",yaxt="n")
  for(i in 1:nx){
    for(j in 1:ny){
      if((i-1)*nx+j<=length(groups_r[[k]])){
        img <- readPNG(paste0("flag",groups_r[[k]][(i-1)*nx+j],".png")) 
        rasterImage(img, i+0.05, j+0.05, i+1-0.05, j+1-0.05)
      }
    }
  }
  par(op)
  dev.off()
}

Les résultats

Et maintenant, peu de texte, place aux images ! Il est temps de voir ce que donnent les précédentes lignes de code. À quoi peut ressembler un drapeau quelconque réarrangé en bandes de couleur ? Quels sont les drapeaux qui ont le rouge comme couleur dominante ? Et ceux qui ont 2/3 d'une couleur et 1/3 d'une autre ?

Décomposer les drapeaux en bandes

La décomposition des drapeaux en bandes de couleurs différentes permet de cibler avec efficience les couleurs dominantes de chaque drapeau. Néanmoins, pour les couleurs mineures, des soucis apparaissent dus notamment à la résolution numérique des images. En effet, l'intersection entre deux couleurs n'est pas toujours nette et il est courant de rencontrer une rangée de pixels dont la couleur est à mi-chemin entre les deux couleurs ; une troisième couleur apparaît ainsi sur l'image récupérée sur le site flagpedia et la méthode de segmentation utilisée ne permet pas de l'éviter. D'autre part, ce nombre de pixels définissant la bande est souvent du même ordre de grandeur que les pixels définissant des dessins présents sur certains drapeaux ; ainsi, une méthode de segmentation évitant la bande aurait de fortes chances d'éviter également ces dessins, ce qui serait dommageable. Une solution : se procurer des images de meilleure résolution.

Cliquez sur l'image pour faire défiler plus rapidement les 199 images.

Segmenter les drapeaux selon leur couleur dominante

vexillologie_palette
Centre des groupes par la méthode des k-moyennes

La segmentation des drapeaux selon la couleur dominante met en avant 7 groupes différents :

  • un groupe de drapeaux dont la couleur prédominante est le vert ;
  • un groupe de drapeaux dont la couleur prédominante est le blanc ;
  • un groupe de drapeaux dont la couleur prédominante est le noir ;
  • un groupe de drapeaux dont la couleur prédominante est le bleu clair ;
  • un groupe de drapeaux dont la couleur prédominante est le rouge ;
  • un groupe de drapeaux dont la couleur prédominante est le jaune ;
  • un groupe de drapeaux dont la couleur prédominante est le bleu foncé ;

Cliquez sur une image pour l'agrandir.

Segmenter les drapeaux selon leurs proportions de différentes couleurs

Dernièrement, on se lance dans la segmentation selon leurs proportions de différentes couleurs. Pour cela, on regarde tout d'abord les centres des groupes où la ligne Gi représente les proportions de différentes couleurs dans les drapeaux associé au ième groupe :

vexillologie-ratios

et on obtient l'interprétation suivante :

  • le premier groupe représente des drapeaux ayant en moyenne trois couleurs dominantes pesant chacune 1/3 des pixels ;
  • le deuxième groupe représente des drapeaux ayant en moyenne quatre couleurs dominantes, pesant environ respectivement 30%, 25%, 25% et 17% des pixels ;
  • le troisième groupe représente des drapeaux ayant en moyenne deux couleurs dominantes, pesant environ 75% et 17% des pixels ;
  • ...

Si on regarde de près le contenu de chacun de ces groupes, on retrouve bien cette répartition moyenne des couleurs dominantes qui les caractérisent, même si de prime abord, ces regroupements de drapeaux n'étaient pas forcément des plus naturels !
Cliquez sur une image pour l'agrandir.

Perspectives

Le but de cet article était de présenter de façon sommaire la méthode de segmentation dite des k-moyennes et de l'appliquer à une étude vexillologique. Néanmoins, comme toute étude, le choix du modèle contraint les résultats. Aussi, voici quelques perspectives à apporter à ces travaux :

  • considérer une autre distance que la distance euclidienne ;
  • considérer une autre palette de couleur que la RGB ;
  • considérer des techniques plus robustes pour sélectionner le nombre de groupes optimal ;
  • améliorer la sélection des centres initiaux ;
  • ramener les images sur une même grille ;
  • ...

Ces perspectives pourraient permettre d'atteindre plusieurs objectifs :

  • ne pas sélectionner des couleurs absentes du drapeau mais présente dans sa version numérique sous forme d'artefacts ;
  • effectuer une segmentation des drapeaux en se basant sur plusieurs de leurs couleurs dominantes ;
  • effectuer une segmentation des drapeaux en se basant sur les formes qu'ils contiennent ;
  • ...

D'autres articles sur la segmentation suivront sur DataSphere, avec peut-être des paramétrisations plus fines des méthodes utilisées, même si le but des études abordées est de présenter l'esprit général d'une méthode d'analyse de données et de montrer ce que l'on peut faire avec, plutôt que de rentrer dans ses variantes ou calibrations optimales.

Les commentaires sont clos.