Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.10 KB | None | 0 0
  1. import ctypes
  2. import tkinter.filedialog
  3.  
  4. import matplotlib.pyplot
  5. import numpy
  6. import skimage.io
  7. import sklearn.decomposition
  8.  
  9. ROOT = tkinter.Tk()
  10.  
  11. FILEPATH = tkinter.filedialog.askopenfilename(title="Ouvrir une image",
  12.                                               filetypes=[('Fichier tiff', '.tif')])
  13. # Choix par l'utilisateur de l'image .tif à utiliser, emplacer stocké dans la variable FILEPATH
  14. ROOT.withdraw()
  15. IMAGE = skimage.io.imread(FILEPATH)
  16. # Conversion de l'image du format TIF au format matriciel (modifiable par Python)
  17.  
  18. NBR_PIXEL_Y = numpy.size(IMAGE, 0)
  19. NBR_PIXEL_X = numpy.size(IMAGE, 1)
  20. NBR_CANAUX = numpy.size(IMAGE, 2)
  21. # Calcul des constantes relatives à l'image sélectionnée (Nombre de pixels et de canaux)
  22.  
  23. if NBR_CANAUX > NBR_PIXEL_Y:  # Erreur dans le calcul précédent du au format des images Landsat
  24.     NBR_CANAUX = numpy.size(IMAGE, 0)
  25.     NBR_PIXEL_Y = numpy.size(IMAGE, 1)
  26.     NBR_PIXEL_X = numpy.size(IMAGE, 2)
  27.     MATRICE = numpy.zeros((NBR_PIXEL_Y, NBR_PIXEL_X, NBR_CANAUX), float)
  28.     for INDEX in range(NBR_CANAUX):
  29.         MATRICE[:, :, INDEX] = IMAGE[INDEX, :, :]
  30. # D'ou modification de l'ordre des constantes si nécessaire + Génération de MATRICE
  31.  
  32. else:
  33.     MATRICE = IMAGE.copy()
  34. # Sinon MATRICE vaut tout simplement l'image matricielle
  35.  
  36.  
  37. print("Matrice des observations")
  38.  
  39. MATRICE_TRANSITION = numpy.reshape(MATRICE[:, :, 0], (1, NBR_PIXEL_Y * NBR_PIXEL_X))
  40. # Le premier canal de MATRICE est maintenant un vecteur ligne.
  41. for INDEX in range(1, NBR_CANAUX):
  42.     MATRICE_TRANSITION = numpy.concatenate(
  43.         (MATRICE_TRANSITION, numpy.reshape(MATRICE[:, :, INDEX], (1, NBR_PIXEL_Y * NBR_PIXEL_X))), axis=0)
  44.  
  45. MATRICE = MATRICE_TRANSITION
  46. # MATRICE est maintenance une matrice de 3 à x lignes avec un nombre de colonnes
  47. # égal au nombre de pixels dans chacune des canaux composant l'image TIF
  48.  
  49. print(MATRICE, "\n")
  50. NOMBRE_DONNES = numpy.shape(MATRICE)[1]
  51. print("Nombre de données : " + str(NOMBRE_DONNES) + "\n")
  52. # nombre de pixels dans chacune des canaux composant l'image TIF
  53.  
  54. MOYENNE = numpy.mean(MATRICE, axis=1)
  55. print("Moyenne des observations")
  56. print(MOYENNE, "\n")
  57. # Vecteur ligne donnant la vecteur de pixel moyen de chacune des canaux de l'image TIF
  58. # Format : Nombre de lignes
  59.  
  60. MOYENNE = numpy.reshape(MOYENNE, (len(MOYENNE), 1))
  61. MATRICE_CENTREE = MATRICE - MOYENNE
  62. print("Matrice centrée des observations")
  63. print(MATRICE_CENTREE, "\n")
  64. # Soustration sur chacune des ligne de la moyenne des lignes
  65. # Format : Le même que MATRICE
  66.  
  67. MATRICE_COVARIANCE = (1.0 / (NOMBRE_DONNES - 1)) * numpy.dot(MATRICE_CENTREE, MATRICE_CENTREE.transpose())
  68. print("Matrice de covariance des observations")
  69. print(MATRICE_COVARIANCE, "\n")
  70. # Calcul de la matrice de covariance  des données
  71. # Format : Nombre de canaux * Nombre de canaux
  72.  
  73. MATRICE_A = (1. / numpy.sqrt(float(NOMBRE_DONNES) - 1)) * MATRICE_CENTREE.transpose()
  74. print("Matrice A")
  75. print(MATRICE_A, "\n")
  76. # Matrice centrée multiplié par la racine carrée du nombre de pixels dans chaque couche ...
  77. # Format : Le même que MATRICE
  78.  
  79. # import numpy.linalg
  80. # U, SM, VT = numpy.linalg.svd(MATRICE_A)
  81.  
  82. # Calcul de la décomposition en valeur singulière
  83. # sauf que les valeurs sont codés sur 4 bits et que j'ai que 16Go de ram et
  84. # qu'ils m'en faudrait une bonne centaine donc "MemoryError"^^
  85.  
  86. ACP = sklearn.decomposition.PCA(n_components=3)
  87. ACP.fit(MATRICE_A)
  88. # https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/decomposition/pca.py#L313
  89.  
  90. # La même chose que le SVD mais on appelle ca le PCA
  91. # Principal Component Analysis
  92. # http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
  93.  
  94. print("\n", "Q1 : Composantes principales")
  95. COMPOSANTE_PRINCIPALES = ACP.components_
  96. print(COMPOSANTE_PRINCIPALES)
  97. print("\n", "Écarts-types associés")
  98. VARIANCE = ACP.explained_variance_ratio_
  99. print(VARIANCE ** 0.5)
  100. print("\n", "Q2 : Variance totale :")
  101. print(numpy.sum(VARIANCE))
  102. print("\n", "Q3 : Pourcentage de variance totale :")
  103. # ACP est une grande librarie dans laquelle on vient récupérer
  104. # les données qui nous interresse : Variance, Composantes principales...
  105.  
  106. TRANSFORMATION = transformation = numpy.dot(MATRICE_A, COMPOSANTE_PRINCIPALES.T)
  107. # https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/decomposition/pca.py#L332
  108. # TRANSFORMATION a 3 colonnes et le même nombre de lignes que MATRICE
  109. """    def transform(self, X):
  110.        Apply dimensionality reduction to X.
  111.  
  112.        X is projected on the first principal components previously extracted
  113.        from a training set.
  114.  
  115. #-----------------------------------------------------------------------------
  116.        check_is_fitted(self, ['mean_', 'components_'], all_or_any=all)
  117.  
  118.        X = check_array(X)
  119.        if self.mean_ is not None:
  120.            X = X - self.mean_
  121.        X_transformed = np.dot(X, self.components_.T)
  122.        if self.whiten:
  123.            X_transformed /= np.sqrt(self.explained_variance_)
  124.        return X_transformed
  125. """
  126.  
  127.  
  128.  
  129. DPI = 100
  130. FIGURE = matplotlib.pyplot.figure()
  131. # On prépare la répresentation graphique de notre ACP
  132.  
  133. for INDEX, VALUE in enumerate(VARIANCE):
  134.     TRANSFORMATION[:, INDEX] += -numpy.min(TRANSFORMATION[:, INDEX])
  135.     TRANSFORMATION[:, INDEX] *= (255 / numpy.max(TRANSFORMATION[:, INDEX]))
  136.     # On prend une matrice dont on ramène la valeur minimale à 0 et la maximale à 255
  137.     # Toutes les valeurs sont modifiées pour améliorer le contraste !
  138.  
  139.     MATRICE = numpy.reshape(TRANSFORMATION[:, (INDEX)], (NBR_PIXEL_Y, NBR_PIXEL_X))
  140.     IMAGE = numpy.zeros((NBR_PIXEL_Y, NBR_PIXEL_X, 3), dtype=numpy.uint8)
  141.     IMAGE[:, :, 0] = MATRICE
  142.     IMAGE[:, :, 1] = MATRICE
  143.     IMAGE[:, :, 2] = MATRICE
  144.     # Affichage d'une image possédant 3 canaux identiques : Image en nuances de gris.
  145.  
  146.     place = int('13' + str(INDEX+1))
  147.     matplotlib.pyplot.subplot(place)
  148.     # 131/132/133 => 1 lignes,3 colonnes,3 images différentes
  149.     skimage.io.imshow(IMAGE)
  150.     # Equivalent de plt.plot pour une image
  151.  
  152.     pourcentage = str(round(VARIANCE[INDEX] / numpy.sum(VARIANCE) * 100, 2))
  153.     # Calcul du pourcentage de chacune des composantes
  154.     print("Composante", INDEX+1, "=", pourcentage, " %")
  155.     titre = "Composante principale " + str(INDEX+1) + " : " + pourcentage + "%"
  156.  
  157.     matplotlib.pyplot.title(titre)
  158.     matplotlib.pyplot.axis('off')
  159.     # On supprime les axes parce que ce sont des images et pas des graphiques
  160.  
  161. USER_INFORMATIONS = ctypes.windll.user32
  162. FIGURE.set_size_inches((USER_INFORMATIONS.GetSystemMetrics(0) / DPI,
  163.                         0.8 * USER_INFORMATIONS.GetSystemMetrics(1) / DPI))
  164. # On optimise la taille de l'image afin qu'elle soit juste à la taille de l'écran en largeur
  165.  
  166. FIGURE.set_tight_layout(True)
  167. # On optimise l'image en faisant en sorte que rien ne se superpose
  168. NOM_SAVE = str(str(FILEPATH).split("/")[-1]).split(".")[0] + '_ACP.png'
  169. # On nomme le fichier de facon intelligente
  170. matplotlib.pyplot.savefig(NOM_SAVE, bbox_inches='tight', dpi=DPI)
  171. # On sauvegarde l'image en supprimant les espaces blancs inutiles sur les cotés
  172. matplotlib.pyplot.show()
  173. # On affiche l'image sans axe dans une fenêtre adaptée en largeur
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement