<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Paul+Aubry</id>
	<title>Wiki du LAMA (UMR 5127) - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="http://os-vps418.infomaniak.ch:1250/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Paul+Aubry"/>
	<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php/Sp%C3%A9cial:Contributions/Paul_Aubry"/>
	<updated>2026-05-21T07:44:54Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13316</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13316"/>
		<updated>2021-05-13T14:53:22Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&lt;br /&gt;
&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&lt;br /&gt;
&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La variable tabImage contient le résultat de la fonction imageTab(), qui renvoit un tableau numpy, avec toutes les informations de chaque points de l&#039;image, sous la forme [ x , y , r , g , b ]. &lt;br /&gt;
Et la variable tabImageCoeff est égal à la fonction précédente mais avec chaque valeur du tableau entre 0 et 1.&lt;br /&gt;
&lt;br /&gt;
La variable centroides calcul les meilleurs centroïdes sous la forme [ x , y , r , g , b ].&lt;br /&gt;
Et coeffCentroides et le même tableau mais avec les valeurs coefficentées.&lt;br /&gt;
&lt;br /&gt;
Les variables qui suivent, permettent de calculer les distances entre les points et les centroïdes, pour ensuite créer les clusters dans la variable clusters.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la boucle for permet de changer la couleur des points de chaque clusters, avec les valeurs [r,g,b] du représentant du cluster.&lt;br /&gt;
&lt;br /&gt;
Pour finir, l&#039;image modifiée est enregistrée avec un nouveau nom.&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13315</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13315"/>
		<updated>2021-05-13T14:49:18Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&lt;br /&gt;
&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&lt;br /&gt;
&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La variable tabImage contient le résultat de la fonction imageTab(), qui renvoit un tableau numpy, avec toutes les informations de chaque points de l&#039;image, sous la forme [ x , y , r , g , b ]. &lt;br /&gt;
Et la variable tabImageCoeff est égal à la fonction précédente mais avec chaque valeur du tableau entre 0 et 1.&lt;br /&gt;
&lt;br /&gt;
La variable centroides calcul les meilleurs centroïdes sous la forme [ x , y , r , g , b ].&lt;br /&gt;
Et coeffCentroides et le même tableau mais avec les valeurs coefficentées.&lt;br /&gt;
&lt;br /&gt;
Les variables qui suivent, permettent de calculer les distances entre les points et les centroïdes, pour ensuite créer les clusters dans la variable clusters.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la boucle for permet de changer la couleur des points de chaque clusters, avec les valeurs [r,g,b] du représentant du cluster.&lt;br /&gt;
&lt;br /&gt;
Pour finir, l&#039;image modifiée est enregistrée avec un nouveau nom.&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13314</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13314"/>
		<updated>2021-05-13T14:46:51Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&lt;br /&gt;
&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&lt;br /&gt;
&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La variable tabImage contient le résultat de la fonction imageTab(), qui renvoit un tableau numpy, avec toutes les informations de chaque points de l&#039;image, sous la forme [ x , y , r , g , b ]. &lt;br /&gt;
Et la variable tabImageCoeff est égal à la fonction précédente mais avec chaque valeur du tableau entre 0 et 1.&lt;br /&gt;
&lt;br /&gt;
La variable centroides calcul les meilleurs centroïdes sous la forme [ x , y , r , g , b ].&lt;br /&gt;
Et coeffCentroides et le même tableau mais avec les valeurs coefficentées.&lt;br /&gt;
&lt;br /&gt;
Les variables qui suivent, permettent de calculer les distances entre les points et les centroïdes, pour ensuite créer les clusters dans la variable clusters.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la boucle for permet de changer la couleur des points de chaque clusters, avec les valeurs [r,g,b] du représentant du cluster.&lt;br /&gt;
&lt;br /&gt;
Pour finir, l&#039;image modifiée est enregistrée avec un nouveau nom.&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13313</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13313"/>
		<updated>2021-05-13T14:46:12Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Introduction : Clustering par k-means */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&lt;br /&gt;
&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&lt;br /&gt;
&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La variable tabImage contient le résultat de la fonction imageTab(), qui renvoit un tableau numpy, avec toutes les informations de chaque points de l&#039;image, sous la forme [ x , y , r , g , b ]. &lt;br /&gt;
Et la variable tabImageCoeff est égal à la fonction précédente mais avec chaque valeur du tableau entre 0 et 1.&lt;br /&gt;
&lt;br /&gt;
La variable centroides calcul les meilleurs centroïdes sous la forme [ x , y , r , g , b ].&lt;br /&gt;
Et coeffCentroides et le même tableau mais avec les valeurs coefficentées.&lt;br /&gt;
&lt;br /&gt;
Les variables qui suivent, permettent de calculer les distances entre les points et les centroïdes, pour ensuite créer les clusters dans la variable clusters.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la boucle for permet de changer la couleur des points de chaque clusters, avec les valeurs [r,g,b] du représentant du cluster.&lt;br /&gt;
&lt;br /&gt;
Pour finir, l&#039;image modifiée est enregistrée avec un nouveau nom.&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13312</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13312"/>
		<updated>2021-05-13T14:45:49Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Réalisation grâce à Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La variable tabImage contient le résultat de la fonction imageTab(), qui renvoit un tableau numpy, avec toutes les informations de chaque points de l&#039;image, sous la forme [ x , y , r , g , b ]. &lt;br /&gt;
Et la variable tabImageCoeff est égal à la fonction précédente mais avec chaque valeur du tableau entre 0 et 1.&lt;br /&gt;
&lt;br /&gt;
La variable centroides calcul les meilleurs centroïdes sous la forme [ x , y , r , g , b ].&lt;br /&gt;
Et coeffCentroides et le même tableau mais avec les valeurs coefficentées.&lt;br /&gt;
&lt;br /&gt;
Les variables qui suivent, permettent de calculer les distances entre les points et les centroïdes, pour ensuite créer les clusters dans la variable clusters.&lt;br /&gt;
&lt;br /&gt;
Ensuite, la boucle for permet de changer la couleur des points de chaque clusters, avec les valeurs [r,g,b] du représentant du cluster.&lt;br /&gt;
&lt;br /&gt;
Pour finir, l&#039;image modifiée est enregistrée avec un nouveau nom.&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13311</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13311"/>
		<updated>2021-05-13T14:27:30Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image. Le programme fait une moyenne des couleurs.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13310</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13310"/>
		<updated>2021-05-13T14:26:30Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13309</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13309"/>
		<updated>2021-05-13T14:25:51Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;J&#039;ai pu obtenir ces résultats après deux minutes environ. On constate que les détails sont les mêmes, et on obtient des couleurs différentes. Plus le coefficient est petit, plus l&#039;image est sombre. Quand le coefficient est égale à zéro, le traitement se fait juste sur les couleurs de l&#039;image.&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13308</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13308"/>
		<updated>2021-05-13T14:19:23Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une image de cette taille, une heure de traitement a été nécessaire. On remarque que les formes principales sont les mêmes, ainsi que les couleurs. Au niveau du ciel et du lac, on peut apercevoir que l&#039;image a été traitée.&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13303</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13303"/>
		<updated>2021-05-13T14:09:36Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13300</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13300"/>
		<updated>2021-05-13T14:08:15Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13299</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13299"/>
		<updated>2021-05-13T14:07:40Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13298</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13298"/>
		<updated>2021-05-13T14:06:36Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13297</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13297"/>
		<updated>2021-05-13T14:03:39Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td&amp;gt;[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13296</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13296"/>
		<updated>2021-05-13T13:57:37Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13295</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13295"/>
		<updated>2021-05-13T13:57:24Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|300px|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:50-0.5Canada.png&amp;diff=13294</id>
		<title>Fichier:50-0.5Canada.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:50-0.5Canada.png&amp;diff=13294"/>
		<updated>2021-05-13T13:54:32Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13293</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13293"/>
		<updated>2021-05-13T13:54:22Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 50-0.5Canada.png|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13292</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13292"/>
		<updated>2021-05-13T13:51:33Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=16, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 50-0.5Canada.jpg|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:16-0Kowloon-small-329x216.png&amp;diff=13291</id>
		<title>Fichier:16-0Kowloon-small-329x216.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:16-0Kowloon-small-329x216.png&amp;diff=13291"/>
		<updated>2021-05-13T13:49:19Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Canada.jpg&amp;diff=13289</id>
		<title>Fichier:Canada.jpg</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Canada.jpg&amp;diff=13289"/>
		<updated>2021-05-13T13:47:55Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:10-0.7Kowloon-small-329x216.png&amp;diff=13288</id>
		<title>Fichier:10-0.7Kowloon-small-329x216.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:10-0.7Kowloon-small-329x216.png&amp;diff=13288"/>
		<updated>2021-05-13T13:46:59Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13287</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13287"/>
		<updated>2021-05-13T13:46:30Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.7Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,7 ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 16-0Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0 ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Canada.jpg|vignette|left|Image originale 1920 x 1080 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 50-0.5Canada.jpg|vignette|right|Image modifiée : k=50, coeff = 0.5 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13286</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13286"/>
		<updated>2021-05-13T13:40:21Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|vignette|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|vignette|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:10-0.0001Kowloon-small-329x216.png&amp;diff=13285</id>
		<title>Fichier:10-0.0001Kowloon-small-329x216.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:10-0.0001Kowloon-small-329x216.png&amp;diff=13285"/>
		<updated>2021-05-13T13:33:49Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13284</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13284"/>
		<updated>2021-05-13T13:33:39Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|left|Image originale 329 x 216 px ]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier: 10-0.0001Kowloon-small-329x216.png|right|Image modifiée : k=10, coeff = 0,0001 ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Kowloon-small-329x216.png&amp;diff=13283</id>
		<title>Fichier:Kowloon-small-329x216.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Kowloon-small-329x216.png&amp;diff=13283"/>
		<updated>2021-05-13T13:31:40Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13282</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13282"/>
		<updated>2021-05-13T13:31:09Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Résultats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;br /&gt;
&lt;br /&gt;
[[Fichier: Kowloon-small-329x216.png|left|Image originale 329 x 216 px ]]&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13281</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13281"/>
		<updated>2021-05-13T13:26:35Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13280</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13280"/>
		<updated>2021-05-13T13:26:16Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme|vignette|right|Algorigramme du Clustering par K-means]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13279</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13279"/>
		<updated>2021-05-13T13:24:35Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Introduction : Clustering par k-means */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right]] &lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13278</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13278"/>
		<updated>2021-05-13T13:23:59Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right]] = Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13277</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13277"/>
		<updated>2021-05-13T13:23:01Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;  [[Fichier:algorigramme.png|vignette|right]]&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13276</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13276"/>
		<updated>2021-05-13T13:22:35Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right]]&lt;br /&gt;
&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13275</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13275"/>
		<updated>2021-05-13T13:18:36Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right]]&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13274</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13274"/>
		<updated>2021-05-13T13:17:58Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png|vignette|right]]&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Algorigramme.png&amp;diff=13273</id>
		<title>Fichier:Algorigramme.png</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Fichier:Algorigramme.png&amp;diff=13273"/>
		<updated>2021-05-13T13:11:20Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13272</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13272"/>
		<updated>2021-05-13T13:10:42Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:algorigramme.png]]&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13217</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13217"/>
		<updated>2021-05-11T19:27:27Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Réalisation grâce à Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13173</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13173"/>
		<updated>2021-05-10T15:04:52Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&amp;lt;br&amp;gt;&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13172</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13172"/>
		<updated>2021-05-10T15:04:04Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&amp;lt;br&amp;gt;&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&amp;lt;br&amp;gt;&lt;br /&gt;
Un point est représenté de la manière suivante : [ x , y , r , g , b ] .&amp;lt;br&amp;gt;&lt;br /&gt;
Avec x et y les coordonnées et r, g, b les composantes de couleurs.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13171</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13171"/>
		<updated>2021-05-10T15:00:36Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;λ&#039;&#039;&#039; qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13170</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13170"/>
		<updated>2021-05-10T15:00:04Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir &#039;&#039;&#039;k&#039;&#039;&#039; points aléatoirement, qui seront les centroïdes, et un coefficient &#039;&#039;&#039;\lambda&#039;&#039;&#039; qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13169</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13169"/>
		<updated>2021-05-10T14:58:40Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13168</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13168"/>
		<updated>2021-05-10T14:57:37Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient \mathbf{\lambda} qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13167</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13167"/>
		<updated>2021-05-10T14:56:26Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient \mathbf{λ} qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13166</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13166"/>
		<updated>2021-05-10T14:56:05Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient \mathbf{&amp;amp;lambda;} qui nous permettra de calculer les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13165</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13165"/>
		<updated>2021-05-10T14:55:18Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient qui nous permettra de calculer &amp;amp;lambda; les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13164</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13164"/>
		<updated>2021-05-10T14:55:02Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient qui nous permettra de calculer &amp;amp;lambda les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
	<entry>
		<id>http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13163</id>
		<title>Clustering par K-means, segmentation d&#039;image</title>
		<link rel="alternate" type="text/html" href="http://os-vps418.infomaniak.ch:1250/mediawiki/index.php?title=Clustering_par_K-means,_segmentation_d%27image&amp;diff=13163"/>
		<updated>2021-05-10T14:54:10Z</updated>

		<summary type="html">&lt;p&gt;Paul Aubry : /* Algorithme pour l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Etudiant : Paul AUBRY&lt;br /&gt;
&lt;br /&gt;
Tuteur : Jacques-Olivier LACHAUD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introduction : Clustering par k-means =&lt;br /&gt;
&lt;br /&gt;
Le clustering ou algorithme des k moyennes a pour but de regrouper des populations en communautés disposant de critères communs proches, jusqu&#039;à avoir des communautés homogènes qu&#039;on appellera cluster et qui ont pour représentant un centroïde.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour déterminer ces clusters, on regroupera les différents éléments en fonction d&#039;une distance. Cette notion de distance est différente en fonction des domaines d&#039;applications.&amp;lt;br&amp;gt;&lt;br /&gt;
Le clustering par k-means peut être utilisé pour faire de la segmentation de clientèle, du clustering en Data Mining ou encore sur des images.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Algorithme pour l&#039;image=&lt;br /&gt;
&lt;br /&gt;
Nous allons voir ici, comment procéder de manière théorique, pour réaliser un clustering.&lt;br /&gt;
Tout d&#039;abord, nous devons choisir \mathbf{k} points aléatoirement, qui seront les centroïdes, et un coefficient qui nous permettra de calculer $lambda les distances.&lt;br /&gt;
&lt;br /&gt;
Ensuite, nous allons affecter chaque point de l&#039;image à un cluster. Pour cela, il faut calculer la distance entre le point, et chaque k. La distance la plus courte nous permettra de déterminer quel cluster choisir.&lt;br /&gt;
&lt;br /&gt;
Pour calculer la distance on utilise la formule suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d =  \lambda (x_1 - x_2)^2 +  \lambda (y_1 - y_2)^2 + (r_1 - r_2)^2 + (g_1 - g_2)^2 + (b_1 - b_2)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lorsque les clusters sont définis, on calcul la moyenne de chaque cluster, afin de récupérer de nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
On réitère les actions vus précédemment mais cette fois-ci avec les nouveaux centres.&lt;br /&gt;
&lt;br /&gt;
Dès que l&#039;on obtient des centres &amp;quot;stable&amp;quot;, on peut modifier l&#039;image.&lt;br /&gt;
&lt;br /&gt;
= Réalisation grâce à Python =&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il faut installer plusieurs bibliothèques.&lt;br /&gt;
* &amp;quot;numpy&amp;quot;, qui va nous servir à effectuer les calculs de manières bien plus rapide.&lt;br /&gt;
* &amp;quot;PIL&amp;quot; pour le traitement des images.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from random import *&lt;br /&gt;
from PIL import Image&lt;br /&gt;
import numpy as np&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transformation des données en tableaux ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def imageTab(fichier):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui récupère toutes les infos du fichier image, pour les convertir&lt;br /&gt;
    en tableaux numpy.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    l = fichier.width&lt;br /&gt;
    h = fichier.height&lt;br /&gt;
&lt;br /&gt;
    res = []&lt;br /&gt;
&lt;br /&gt;
    for x in range(0,l):&lt;br /&gt;
        for y in range(0,h):&lt;br /&gt;
            r,g,b = fichier.getpixel((x,y))&lt;br /&gt;
&lt;br /&gt;
            res += [ x, y, r, g, b]&lt;br /&gt;
&lt;br /&gt;
    tab = np.array(res, dtype=float)&lt;br /&gt;
&lt;br /&gt;
    nTab = tab.reshape(l*h,5)&lt;br /&gt;
&lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def coordonnees_alea(k, l, h, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne k coordonnees et leurs couleurs&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    res = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        x = randint(0,l-1)&lt;br /&gt;
&lt;br /&gt;
        y = randint(0,h-1)&lt;br /&gt;
&lt;br /&gt;
        r,g,b = image.getpixel((x,y))&lt;br /&gt;
        &lt;br /&gt;
        res = res + [[x, y, r, g, b]]&lt;br /&gt;
&lt;br /&gt;
        tab = np.array(res, dtype=float)&lt;br /&gt;
       &lt;br /&gt;
&lt;br /&gt;
    return tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Calcul des distances ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def coefficiente_valeur(tab, l, h):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entree : tableau numpy&lt;br /&gt;
    Sortie : tableau numpy avec les coordonnées et les couleurs entre 0 et 1&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    tab2 = np.zeros((len(tab),5), dtype=float)&lt;br /&gt;
    &lt;br /&gt;
    tab2[:,0] = tab[:,0] / l&lt;br /&gt;
    tab2[:,1] = tab[:,1] / h&lt;br /&gt;
    tab2[:,2] = tab[:,2] / 255&lt;br /&gt;
    tab2[:,3] = tab[:,3] / 255&lt;br /&gt;
    tab2[:,4] = tab[:,4] / 255&lt;br /&gt;
    &lt;br /&gt;
    return tab2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distancePoints(tab1, tab2, k, coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;donne la distance en couleur entre 2 points&lt;br /&gt;
    Entrée : deux tableaux numpy &lt;br /&gt;
    Sortie : un tableau numpy avec les distances entre les points de l&#039;image et les k&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    taille = len(tab1)&lt;br /&gt;
&lt;br /&gt;
    nTab = np.zeros((taille,k),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,taille):&lt;br /&gt;
        for j in range(0,k):&lt;br /&gt;
            nTab[i][j] = coef*( tab1[i][0] - tab2[j][0] )**2 + coef*( tab1[i][1] - tab2[j][1] )**2 + ( tab1[i][2] - tab2[j][2] )**2 + ( tab1[i][3] - tab2[j][3] )**2 + ( tab1[i][4] - tab2[j][4] )**2&lt;br /&gt;
            &lt;br /&gt;
    return nTab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def distance_plus_courte(tab):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy avec les k distances pour chaque points&lt;br /&gt;
    Sortie : tableau numpy des indices où la distance est la plus petite&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    indice = np.argmin(tab,axis=1)&lt;br /&gt;
    &lt;br /&gt;
    return indice&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attribution aux clusters ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def kTab(k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un entier k&lt;br /&gt;
    Sortie: un tableau de k tableaux vide&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    tab = []&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        &lt;br /&gt;
        tab = tab + [[]]&lt;br /&gt;
      &lt;br /&gt;
    return tab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def attribution_aux_clusters(tabImage, tabIndice, k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy, un avec les info de l&#039;image, et les indices des distances les plus courtes&lt;br /&gt;
    Sortie : tableau de tableaux numpy des clusters&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    cluster = kTab(k)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(tabImage)):&lt;br /&gt;
&lt;br /&gt;
        indice = tabIndice[i]&lt;br /&gt;
&lt;br /&gt;
        cluster[indice] += [tabImage[i].tolist()]&lt;br /&gt;
&lt;br /&gt;
    return cluster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def clustersEnNumpy(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : un tableau de tableaux de tableaux de points, un nb de cluster&lt;br /&gt;
    Sortie : un tableau de tableaux Numpy&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Ntab = kTab(k)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        Ntab[i] = np.array(tab[i],dtype=float)&lt;br /&gt;
&lt;br /&gt;
    return Ntab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nouveaux Centroïdes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def NouveauxCentres(tab,k):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau de tableaux numpy avec les coordonnées des points appartenant à un cluster&lt;br /&gt;
    Sortie : un tableau Numpy avec les du nouveaux centres&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    Nclusters = np.zeros((k,5),dtype=float)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
&lt;br /&gt;
        moy = ( np.sum(tab[i],axis=0) / len(tab[i]) )&lt;br /&gt;
        moy = moy.astype(int)&lt;br /&gt;
&lt;br /&gt;
        Nclusters[i] = moy&lt;br /&gt;
&lt;br /&gt;
    return Nclusters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculCentres(tabImage, tabImageCoeff, tabCentre, k , l, h, coeff):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fonction qui reprend toutes celles précédentes, pour calculer un nouveau centre&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    coeffCentre = coefficiente_valeur(tabCentre, l , h)&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentre,k,coeff)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyCluster = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    res = NouveauxCentres(NumpyCluster,k)&lt;br /&gt;
&lt;br /&gt;
    return res&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def meilleurs_centres(tabImage, tabImageCoeff,k,l,h,coeff,image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : 2 tableaux Numpy avec les infos de l&#039;image (1 coefficienté et l&#039;autre non), 3 entiers, 1 flottant et une procédure d&#039;ouverture d&#039;image)&lt;br /&gt;
    Sortie : un tableau Numpy, le centre optimal du cluster&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    centre = coordonnees_alea(k, l, h, image)&lt;br /&gt;
    nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
    i = 0&lt;br /&gt;
    print(&amp;quot;Execution en cours :  0 %&amp;quot;)&lt;br /&gt;
    while i &amp;lt; 10:&lt;br /&gt;
        centre = nouveauCentre&lt;br /&gt;
        nouveauCentre = calculCentres(tabImage, tabImageCoeff, centre,k,l,h,coeff)&lt;br /&gt;
        print(&amp;quot;Execution en cours : &amp;quot;+str(i+1)+&amp;quot;0 %&amp;quot;)&lt;br /&gt;
        i = i +1&lt;br /&gt;
&lt;br /&gt;
    return nouveauCentre&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modification des couleurs de l&#039;image ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def change_couleur_cluster(tabCluster, tabCentre, image):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée : tableau numpy de points d&#039;un cluster&lt;br /&gt;
    Sortie : zone de couleur changée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numpyCluster = tabCluster.astype(int)&lt;br /&gt;
    NtabCluster = numpyCluster.tolist()&lt;br /&gt;
&lt;br /&gt;
    numpyCentres = tabCentre.astype(int)&lt;br /&gt;
    NtabCentres = numpyCentres.tolist()&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    for i in range(0,len(NtabCluster)):&lt;br /&gt;
&lt;br /&gt;
        image.putpixel( (NtabCluster[i][0] , NtabCluster[i][1]   ), ( NtabCentres[2], NtabCentres[3], NtabCentres[4] ) )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fonction finale, le clustering ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def clustering(k,coef):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Entrée :1 entier un flottant&lt;br /&gt;
    Sortie : image modifiée&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    image0 = Image.open(&amp;quot;Kowloon-small-329x216.png&amp;quot;)&lt;br /&gt;
    image = image0&lt;br /&gt;
&lt;br /&gt;
    l = image.width&lt;br /&gt;
    h = image.height&lt;br /&gt;
&lt;br /&gt;
    tabImage = imageTab(image)&lt;br /&gt;
    tabImageCoeff = coefficiente_valeur(tabImage, l, h)&lt;br /&gt;
&lt;br /&gt;
    centroides = meilleurs_centres(tabImage, tabImageCoeff, k, l ,h, coef, image)&lt;br /&gt;
    coeffCentroides = coefficiente_valeur(centroides, l, h)&lt;br /&gt;
&lt;br /&gt;
    distance = distancePoints(tabImageCoeff, coeffCentroides,k,coef)&lt;br /&gt;
    indice = distance_plus_courte(distance)&lt;br /&gt;
&lt;br /&gt;
    clusters = attribution_aux_clusters(tabImage,indice,k)&lt;br /&gt;
    NumpyClusters = clustersEnNumpy(clusters,k)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;En cours de finalisation...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for i in range(0,k):&lt;br /&gt;
        change_couleur_cluster( NumpyClusters[i] , centroides[i] , image )&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
    image.save(str(k)+&amp;quot;-&amp;quot;+str(coef)+&amp;quot;Kowloon-small-329x216.png&amp;quot;)    &lt;br /&gt;
    image.show()&lt;br /&gt;
    image0.close()&lt;br /&gt;
    image.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Résultats =&lt;/div&gt;</summary>
		<author><name>Paul Aubry</name></author>
	</entry>
</feed>