Ce TD « Météo » est un sujet visant à fusionner deux images. Cette application a pour objectif d’ajouter le présentateur filmé sur un fond bleu à une image de la météo.
Sujet pdf du TP :
proxy.php?id=pdf-itc1-7-1Si tu travailles avec Pyzo et que tu obtiens l’erreur « No such file or directory », va consulter cette page: LIEN
Programme ce TP directement ici sur Basthon en y collant le code élève du prochain Basthon :
↑ Ce Basthon reste en cache du navigateur ↑
Visualiser le Basthon élèves
Visualiser le Basthon correction
Visualiser les liens Dropbox vers les différents documents de ce TD
Codes non exécutables indépants de Basthon et Dropbox (peuvent ne pas être à jour)
Code élèves :
''' 7 - Matrices de pixels et images'''
'''Dossier partagé images: https://www.dropbox.com/sh/6hd4ke2tdyfusz4/AAANYamOymhnHQF3n_sHe5GNa?dl=0'''
## 7-1 - Météo
''' Utilisation de np.load sur les images npy afin d'éviter un paquet de problèmes sur les ordinateurs du lycée et même certains ordinateurs personnels avec plt.imread - Le fichier Python et les images au format npy doivent être dans le même dossier - Avantages: Fonctionne vite - Inconvénients: ne traite pas les BMP, et n'est donc utilisable que si auparavant, les BMP ont été chargées puis enregistrées au format npy'''
# Import des librairies
import matplotlib.pyplot as plt
import numpy as np
# Définition des fonctions
def f_Affiche(image):
plt.figure()
plt.imshow(image)
plt.axis('off')
plt.show()
# Réinitialisation des images
plt.close('all')
# Import des images
'''
Chemin:
Dans la barre de menu haut: Run - Cocher "Change directory when executing file"
Votre fichier python doit exister et se trouver au meme endroit que les images - L'onglet en haut à gauche de pyzon ne doit pas afficher tmp...
Il faut exécuter le foce avec F5
Essayer le code tel quel et voir si l'image s'affiche
Si l'image n'est pas trouvée, remplacer la variable chemin actuellement vide par par le chemin où se trouvent vos fichiers en doublant les \, exemple:
Chemin = "U:\\Dossier\\"
Erreur ? cf cours
'''
Chemin = ""
Image_Filmee = np.load(Chemin + "7-1 - Image_Filmee.npy")
Image_Meteo = np.load(Chemin + "7-1 - Image_Meteo.npy")
'''Pour charger les images bmp directement'''
#Image_Filmee = plt.imread(Chemin + "7-1 - Image_Filmee.bmp")
#Image_Filmee = Image_Filmee[:,:,:3]
#Image_Meteo = plt.imread(Chemin + "7-1 - Image_Meteo.bmp")
#Image_Meteo = Image_Meteo[:,:,:3]
# Affichage de l'image
f_Affiche(Image_Filmee)
f_Affiche(Image_Meteo)Code de la correction :
''' 7 - Matrices de pixels et images'''
'''Dossier partagé images: https://www.dropbox.com/sh/6hd4ke2tdyfusz4/AAANYamOymhnHQF3n_sHe5GNa?dl=0'''
## 7-1 - Météo
# Question 1 - Ouverture et affichage
import matplotlib.pyplot as plt
plt.close('all')
import numpy as np
def f_Affiche(image):
plt.figure()
plt.imshow(image)
plt.axis('off')
plt.show()
Image_Filmee = plt.imread("7-1 - Image_Filmee.bmp")
Image_Filmee = Image_Filmee[:,:,:3]
Image_Meteo = plt.imread("7-1 - Image_Meteo.bmp")
Image_Meteo = Image_Meteo[:,:,:3]
np.save('7-1 - Image_Filmee',Image_Filmee)
np.save('7-1 - Image_Meteo',Image_Meteo)
f_Affiche(Image_Filmee)
f_Affiche(Image_Meteo)
# Question 2 - f_fusion
def f_fusion(Im_fond,Im_film):
'''Version qui ajoute la météo sur l'image du présentateur avec fond bleu - Tout le bleu doit être remplacé'''
Nl,Nc,Ras = np.shape(Im_fond)
Im_Fusion = np.copy(Im_film)
for c in range(Nc):
for l in range(Nl):
R,G,B = Im_film[l,c]
Est_Bleu = R < 100 and G < 100 and B > 100
# Est_Bleu = R == 64 and G == 64 and B == 128
if Est_Bleu:
Im_Fusion[l,c] = Im_fond[l,c]
return Im_Fusion
def f_fusion(Im_fond,Im_film):
''' Version qui ajoute le présentateur à l'image météo - Moins d'affectations car seule la zone du présentateur est remplacée'''
Nl,Nc,Ras = np.shape(Im_fond)
Im_Fusion = np.copy(Im_fond)
for c in range(Nc):
for l in range(Nl):
R,G,B = Im_film[l,c]
Est_Bleu = R < 100 and G < 100 and B > 100
if not(Est_Bleu): # Lire remarque
Im_Fusion[l,c] = Im_film[l,c]
return Im_Fusion
'''Remarque: Attention not(Est_Bleu) est différent de R > 100 and G > 100 and B < 100 '''
Image_Fusionnee = f_fusion(Image_Meteo,Image_Filmee)
f_Affiche(Image_Fusionnee)
plt.imsave("7-1 - Image_Fusionnee.bmp",Image_Fusionnee)
np.save('7-1 - Image_Fusionnee',Image_Fusionnee)
# Question 3 - Complexité
'''
O(Nl*Nc)
'''
# Question 4 - Améliorations
'''
Réduire la qualité des images ? Pas gagné
Compte tenu de la complexité, un traitement en direct n'est pas gagné, on peut filmer et diffuser quelques minutes après, le temps de tout traiter
Pour nos fonctions, il vaut mieux utiliser la fonction qui ajoute le présentateur à la météo car il y a moins d'affectations... Mais autant de tests. ce n'est pas un gain énorme...
Ensuite:
- On pourrait identifier la plage de colonnes à traiter en tirant quelques pixels dans l'image et en identifiant la zone ou est le présentateur (pixel non bleu)
- A partir du moment où on a n pixel dans le présentateur, créer un parcours qui identifie toute la zone non bleue :)
Avec cette méthode, on traitrerai quasi uniquement les pixels du présentateur :)
'''