{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![En tête general](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/En_tete_general.png)\n", "\n", "\n", "© Copyright Franck CHEVRIER 2019-2021 https://www.python-lycee.com.
\n", "Les activités partagées sur Capytale sont sous licence Creative Commons.\n", "\n", " Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Avertissement :
\n", "Les formules des filtres de détection de contours données dans cette activité sont des versions simplifiées par rapport aux formules rigoureuses.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Filtres de détection de contours \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sommaire\n", "\n", "0. Introduction
\n", "1. Filtre de Prewitt
\n", "2. Filtre de Roberts
\n", "3. Filtre de Sobel
\n", "4. Complément
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0. Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On s'intéresse ici au traitement d'image en niveaux de gris, dont la luminosité d'un pixel est codée sur 1 bit (valeur allant de $\\;\\;$0$\\;\\;$ à 255 ).
\n", "Le principe de la détection de contours consiste, à transformer une image pour que ses contours apparaissent en blanc sur fond noir (avec niveaux de gris).\n", "

\n", "Pour déterminer la luminosité d'un pixel de détection des contours, on utilise un filtre qui permet de calculer cette luminosité à partir des 9 pixels qui entourent le pixel d'origine, comme l'indique le schéma ci-dessous :\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "\n", "## 1. Filtre de Prewitt\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On fournit la fonction Python Prewitt_v ci-dessous, qui correspond au calcul mathématique de la partie entière de :

\n", "$$ \\frac { \\lvert \\;NW+W+SW-NE-E-SE \\; \\rvert }{3}$$ \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Exécuter cette cellule pour stocker la fonction en mémoire\n", "\n", "def Prewitt_v(NW,N,NE,W,C,E,SW,S,SE):\n", " '''\n", " Filtre v partiel de Prewitt\n", " '''\n", " return abs( NW + W + SW - NE - E - SE )//3 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.1. Calculer la valeur du pixel de détection dans chacun des cas suivants pour ce filtre Prewitt_v.
\n", "$\\quad\\;\\;$(On pourra effectuer les calculs à l'aide d'appels à la fonction Python Prewitt_v)
\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Utiliser ces zones Python pour les calculs\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.2. Exécuter la fonction Python Visualisation_Filtre qui, appliquée à Prewitt_v, permet :
\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Exécuter cette cellule\n", "from Detection_contours import *\n", "\n", "Visualisation_Filtre(Prewitt_v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$\\quad$a. À l'aide des curseurs, vérifier les résultats de la question 1.1.
\n", "$\\quad$b. En observant les images de test, indiquer quels types de contours semblent être mieux détectés par la fonction Prewitt_v.
\n", "

\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.3.a. Écrire une fonction Python Prewitt_h qui correspond au calcul mathématique de la partie entière de :

\n", "$$ \\frac { \\lvert \\;NW+N+NE-SW-S-SE \\; \\rvert }{3}$$ \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction Prewitt_h\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$\\quad$b. Exécuter l'appel à la fonction Visualisation_Filtre ci-dessous pour tester la fonction Prewitt_h." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Visualisation_Filtre(Prewitt_h)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$\\quad$c. Quels types de contours semblent être mieux détectés par la fonction Prewitt_h ?\n", "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.4. On souhaite maintenant appliquer un filtre Prewitt qui est la moyenne des deux filtres Prewitt_v et Prewitt_h.
\n", "$\\quad\\;\\;$a. Écrire cette fonction Python Prewitt.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction Prewitt\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$\\quad$b. Exécuter l'appel à la fonction Visualisation_Filtre ci-dessous pour tester la fonction Prewitt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Visualisation_Filtre(Prewitt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$\\quad$c. Que peut-on dire de la détection des contours de ce filtre Prewitt par rapport aux deux précédents ?\n", "
\n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "\n", "## 2. Filtre de Roberts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le filtre de Roberts correspond au calcul mathématique de la partie entière de :

\n", "$$ \\frac { \\lvert \\; C-SE \\; \\rvert + \\lvert \\; S-E \\; \\rvert }{2}$$\n", "
\n", "Écrire la fonction Python Roberts correspondante et tester à l'aide de la fonction Visualisation_Filtre.\n", "
\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction Roberts\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Exécuter cette cellule pour tester le filtre de Roberts\n", "\n", "Visualisation_Filtre(Roberts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "\n", "## 3. Filtre de Sobel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3.1. Les 4 fonctions de filtre Sobel_1, Sobel_2, Sobel_3 et Sobel_4 données ci-dessous ont pour but de détecter des contours horizontaux, verticaux et obliques.
\n", "À l'aide d'appels à la fonction Visualisation_Filtre, associer à chacun de ces filtres la direction qui correspond.

\n", "Aide :
On pourra observer les effets des filtres sur le jeu de tests suivant :\n", " \n", "\n", " \n", " \n", "
\n", "\n", "
\n", "
\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def Sobel_1(NW,N,NE,W,C,E,SW,S,SE):\n", " '''\n", " Filtre partiel 1 de Sobel\n", " '''\n", " return abs(NW+2*W+SW-NE-2*E-SW) //4\n", "\n", "\n", "def Sobel_2(NW,N,NE,W,C,E,SW,S,SE):\n", " '''\n", " Filtre partiel 2 de Sobel\n", " '''\n", " return abs(NW+2*N+NE-SW-2*S-SE) //4\n", "\n", "\n", "def Sobel_3(NW,N,NE,W,C,E,SW,S,SE):\n", " '''\n", " Filtre partiel 3 de Sobel\n", " '''\n", " return abs(W+2*SW+S-N-2*NE-E) //4\n", "\n", "\n", "def Sobel_4(NW,N,NE,W,C,E,SW,S,SE):\n", " '''\n", " Filtre partiel 4 de Sobel\n", " '''\n", " return abs(W+2*NW+N-E-2*SE-S) //4" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer ici des appels à la fonction Visualisation_filtre\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3.2. La fonction de filtre Sobel est la moyenne des 4 filtres précédents.
\n", "$\\quad\\;\\;$ Écrire et tester cette fonction.\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Écrire ici la fonction Sobel\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Effectuer ici un appel à la fonction Visualisation_filtre\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Complément" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le programme qui contient la fonction Python Visualisation_Filtre utilisée dans cette activité est accessible ici." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "© Copyright Franck CHEVRIER 2019-2021 https://www.python-lycee.com.
\n", "Les activités partagées sur Capytale sont sous licence Creative Commons.\n" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" } }, "nbformat": 4, "nbformat_minor": 2 }