Académique Documents
Professionnel Documents
Culture Documents
Objectif du TP
L'objectif de ce TP est l’implémentation d’une interface graphique en utilisant la bibliothèque
PyQt5 permettant d’exécuter quelques traitements basiques sur les images (l’affichage d’une
image, sa décomposition en différents canaux, la conversion entre les espaces de couleurs et la
détection des contours) en utilisant l’environnement de développement PyCharm et la
bibliothèque OpenCV.
Page 1 sur 6
Un premier bouton « valider » qui permet l’affichage de l’image après sa conversion
vers un autre espace de couleurs sélectionné.
Deux zones de saisie labélisés « seuil 1 » et « seuil 2 » qui permettent de saisir les seuils
qui seront par la suite utilisés lors de la détection de contours.
Un deuxième bouton « valider » qui permet l’affichage de l’image contours selon les
seuils saisis.
Page 2 sur 6
2. Question 2
Pour afficher l'interface graphique et s’assurer du bon fonctionnement de l’application:
a. Commencer par importer les bibliothèques nécessaires dans le fichier « main.py » :
class designWindow(QtWidgets.QMainWindow,
Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = designWindow()
window.show()
sys.exit(app.exec_())
3. Question 3
a. Développer une fonction makeFigure qui permet d’ajouter une figure (une
image/un graphe) à un Widget:
Page 3 sur 6
b. Développer la méthode showDimensions qui permet de calculer et afficher les
dimensions d’une image dans le Widget dédié (Dimensions)
c. Développer la fonction get_image qui permet de parcourir les fichiers images (.jpg,
.jpeg et .png), d’afficher l’image sélectionnée dans le Widget dédié (OriginalImg)
ainsi que d’afficher ses dimensions:
La lecture d’une image avec OpenCV est réalisée avec la fonction
cv2.imread :
img = cv2.imread(file_path)
La conversion d’une image au format QPixmap (le format requis pour
qu’une image peut être afficher dans un widget particulièrement un Qlabel)
est réalisée en utilisant la méthode suivante :
def convert_cv_qt(self, cv_image):
"""Convert from an opencv image to QPixmap"""
h, w, ch = cv_image.shape
bytes_per_line = ch * w
cv_image_Qt_format =
QtGui.QImage(cv_image.data, w, h, bytes_per_line,
QtGui.QImage.Format_BGR888)
return QPixmap.fromImage(cv_image_Qt_format)
4. Question 4
a. Développer la fonction showRedChannel qui permet d’extraire la composante
rouge de l’image sélectionnée et l’afficher dans le Widget dédié (RedChannel)
b. Développer la fonction showBlueChannel qui permet d’extraire la composante
bleue de l’image sélectionnée et l’afficher dans le Widget dédié (BlueChannel)
c. Développer la fonction showGreenChannel qui permet d’extraire la composante
verte de l’image sélectionnée et l’afficher dans le Widget dédié (GreenChannel)
d. Dans la méthode __init__, gérer les évènements « au clic sur le bouton afficher
composante » en associant les fonctions showRedChannel, showBlueChannel et
showGreenChannel aux boutons DisplayRedChan, DisplayBlueChan et
DisplayGreenChan respectivement.
Page 4 sur 6
5. Question 5
a. Développer la fonction showNewImage qui permet de convertir l’image
sélectionnée de l’espace BGR vers l’espace de couleurs choisi à travers les boutons
radios, enregistrer la nouvelle image en tant que fichier image sous le nom
« NewImg.png » l’afficher dans le Widget dédié (NewImg) :
La conversion d’une image de l’espace RBG en un nouvel espace de
couleurs s’effectue sous OpenCV en utilisant la fonction cv2.cvtColor.
YCrCb _image=cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
L’enregistrement d’une image s’effectue sous OpenCV en utilisant la
fonction cv2.imwrite.
cv2.cvtColor(‘NewImg.png’ , YCrCb _image)
b. Dans la méthode __init__, gérer les évènements « au clic sur le premier bouton
valider » en associant la fonctions showNewImage au boutons validate
6. Question 6
a. Développer une fonction getFirstThreshold qui permet de récupérer le premier
seuil entré dans la zone de saisie (FirstThresh)
b. Développer une fonction getSecondThreshold qui permet de récupérer le deuxième
seuil entré dans la zone de saisie (SecondThresh)
c. Développer une fonction showContours qui permet d’extraire les contours à partir
de l’image sélectionnée et les afficher dans le Widget dédié (ContoursImg):
La détection des contours d’une image avec OpenCV est réalisée par
l’application des étapes suivantes :
Convertir l’image en niveaux de gris avec la fonction cv2.cvtColor
img_gray =cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
Application d’un seuillage binaire selon les seuils FirstTH et SecondTH avec
la fonction cv2.threshold
ret, thresh = cv2.threshold(img_gray, FirstTH, SecondTH,
cv2.THRESH_BINARY).
Détection des contours sur l’image en niveaux de gris avec la fonction
cv2.findContours
contours, hierarchy = cv2.findContours(image=thresh,
mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
Dessiner les contours détectés sur l’image originale avec la fonction
cv2.drawContours
Page 5 sur 6
image_copy = img.copy()
cv2.drawContours(image=image_copy, contours=contours,
contourIdx=-1, color=(0, 255, 0), thickness=2,
lineType=cv2.LINE_AA)
d. Dans la méthode __init__, gérer l’évènement « au clic sur le deuxième bouton
valider » en associant la fonction showContours au bouton (validate_2)
7. Question 7
Page 6 sur 6