Appendices

Couleurs des pixels

Dans cette section, nous montrons comment accéder aux pixels individuels d’une image PIL, en précisant comment ceux-ci sont représentés.

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

Reprenons l’image de départ:

img = Image.open("apple.png")
img

et le tableau numpy correspondant

M = np.array(img)

On peut récupérer la couleur d’un pixel à partir de ses coordonnées avec:

M[3,5]

Déterminer la couleur du pixel en haut à gauche et du pixel du milieu:

# YOUR CODE HERE
raise NotImplementedError()
# YOUR CODE HERE
raise NotImplementedError()

Retrouvez les couleurs de l’image à l’aide du composant de choix de couleur ci-dessous (cliquez sur le carré de couleur), et vérifiez la cohérence avec les résultats ci-dessus.

plt.imshow(M)
import ipywidgets
ipywidgets.ColorPicker()

Vous vous êtes peut-être demandé la signification de dtype=uint8 dans l’affichage des pixels? Les niveaux de couleur sont indiqués par des nombres entre 0 et 255. Ils sont représentés en interne par des entiers (int) courts stockés sur 8 bits (8), sans signe (u). Quelle conséquence en pratique? Faisons un calcul: ici, on va multiplier tous les coefficients par \(2\):

pixel = M[128,128]
pixel
2 * pixel

Comme vous pouvez le constater, tous les calculs ont lieu modulo \(256\)!

Si on souhaite faire des calculs sur, par exemple, de vrais entiers, on peut le spécifier comme suit:

pixel = np.array( M[128,128], dtype=int)
2 * pixel

Pour faire des calculs sur des nombres réèls à virgule, il y a un raccourci pratique; c’est ce que nous utiliserons par la suite:

pixel = M[128,128] * 1.0
pixel
2 * pixel

Aspect ratio of a shape

We illustrate how to compute the aspect ration of shape given by a cloud of points using singular value decomposition. Here, we use a Gaussian cloud of points:

print("Moyenne vraie")
mean = [0, 0]
print(mean)

print("Covariance vraie")
cov = [[1, 0.9], [0.9, 1]]
print(cov)

print("Nombre d'exemples")
N = 200
print(N)
      
print("Echantillon (10 premiers exemples seulement)")
M = np.random.multivariate_normal(mean, cov, N)
print(M[:10,:])

print("Moyenne empirique")
mu = np.mean(M, axis=0)
print(mu)

print("Variance empirique, ddof=1")
sigma2 = np.var(M, axis=0, ddof=1)
print(sigma2)

print("Variance empirique, ddof=0")
sigma2 = np.var(M, axis=0, ddof=0)
print(sigma2)

print("Ecart type empirique, ddof=0")
sigma = np.std(M, axis=0)
print(sigma)

print("Racine de la variance empirique, ddof=0")
print(np.sqrt(sigma2))

print("Centrage des donnees")
M = M - np.tile(mu, [M.shape[0], 1])

print("Covariance empirique")
C = (1./N) * np.mat(M).transpose() * np.mat(M)
print(C)

print("Singular value decomposition (SVD)")
U, s, V = np.linalg.svd(M, full_matrices=False)
print(U.shape, s.shape, V.shape)
# Unit test
print("Reconstruction de M")
MM = np.dot(U * s, V)
MMc = MM + np.tile(mu, [M.shape[0], 1]) # Add center
print(MMc[:10,:])
print(np.allclose(M, MM))

print("Reconstruction de C")
V = np.mat(V)
S = np.diag(s)
CC = (1./N) * V.transpose() * S * S* V
print(CC)
print(np.allclose(C, CC))

print("Singular values")
print(s)
print("Eigen vectors")
print(V)

plt.figure(figsize=(10,10))
plt.scatter(M[:,0], M[:,1])
plt.plot(mu[0], mu[1], 'ro', linewidth=50, markersize=10)
a0 = s[0]/np.sqrt(N)
a1 = s[1]/np.sqrt(N)
plt.plot([mu[0], mu[0]+a0*V[0,0]], [mu[1], mu[1]+a0*V[0,1]], 'r-', linewidth=3)
plt.plot([mu[0], mu[0]-a0*V[0,0]], [mu[1], mu[1]-a0*V[0,1]], 'r-', linewidth=3)

plt.plot([mu[0], mu[0]+a1*V[1,0]], [mu[1], mu[1]+a1*V[1,1]], 'g-', linewidth=3)
plt.plot([mu[0], mu[0]-a1*V[1,0]], [mu[1], mu[1]-a1*V[1,1]], 'g-', linewidth=3)

plt.xlim(-3, 3)
plt.ylim(-3, 3)
ax=plt.gca()
ax.set_aspect('equal', adjustable='box')