ITC1 – TD 7-1

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-1

Si 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

Liens :

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  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  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 :)
'''

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Les Sciences Industrielles de l'Ingénieur (SII) et l'Informatique du Tronc Commun (ITC) en CPGE par Denis DEFAUCHY