Commit 4b3e5247 authored by Matthieu PERREIRA DA SILVA's avatar Matthieu PERREIRA DA SILVA
Browse files

Petites corrections diverses

parent c0777b10
Pipeline #22065 passed with stage
in 41 seconds
This diff is collapsed.
%% Cell type:markdown id: tags:
# TP image - filtrage
Dans ce TP, quelques images sont fournies, mais vous êtes fortement encouragés à récupérer et expérimenter sur d'autres images récupérées sur le web.
Les TP de traitement d'images sont réalisés en Python3, à l'aide de la librairie [scikit-image](http://scikit-image.org/docs/stable/). Les tableaux utilisés (`ndarray`) par cette librairie pour manipuler les images proviennent de la librairie [numpy](https://docs.scipy.org/doc/). L'affichage des images et autres figures est réalisé grace à [matplotlib](https://matplotlib.org/contents.html). La documentation de ces trois librairies vous sera donc bien utile.
Dans ce TP, les questions seront indiquées dans un bloc **question**, et les réponses seront à donner dans le bloc **réponse** situé en dessous du bloc de question. Vos réponses sont à rédiger en [markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet). Vous pourrez ainsi répondre non seulement avec du texte, mais aussi avec des tableaux et des images.
Ce TP est à réaliser en deux séances d'1h30.
**Remarque importante:** Les questions posées dans ce TP requièrent généralement des <u>réponses courtes mais justifées</u>. Un simple oui ou non ne nous est d'aucune utilité pour juger de votre compréhension de la question et de sa réponse...
**Autre remarque:** Il y a parfois plusieurs sous-questions dans une même question. <u>Pensez a répondre à toutes les sous-questions</u>.
%% Cell type:code id: tags:
``` python
%matplotlib widget
# la ligne précédente permet d'afficher les figures directement dans votre notebook et de pouvoir interagir avec
# On importe tous les modules dont nous aurons besoin pour ce TP
import numpy as np # pour les ndarray (donc les tableaux / matrices) et les convolutions
import scipy as sp # pour la déconvolution
import matplotlib.pyplot as plt # gestion des figures
from scipy import signal
from skimage import io,data,color # on charge le module permettant d'ouvrir des images
```
%% Cell type:markdown id: tags:
## La convolution en dimension 1 sur des petits exemples
%% Cell type:markdown id: tags:
**Question 1:**
- Faire le calcul de convolution $[1, 1, 1]*[1, 1, 1]$ à la main pour vérifier que ça donne bien ce que trouve la machine (donnez les détails du calcul dans la case réponse).
- Ce filtre est-il **linéaire** ?
%% Cell type:markdown id: tags:
**Réponse 1**: VOTRE REPONSE ICI
%% Cell type:markdown id: tags:
Cette convolution nécessite de traiter un problème pas très intéressant mais inévitable : que fait-on quand le calcul de convolution fait appel à des valeurs du signal "hors de ses bornes", c.a.d. avant son début ou après sa fin ? On rencontrera le même problème en image, hors des bords de l'image. La fonction 'convolve' de scipy suppose que le signal vaut 0 hors de son domaine de définition, mais elle permet de choisir de donner (option 'full') ou pas (option 'valid') les résultats selon qu'ils font appel à des 0 introduits artificiellement sur les bords. L'option 'same' est un intermédiaire qui renvoie un résultat de même taille que le vecteur d'entrée. Les diverses manières de traiter cette question (qui n'est *pas* centrale au TP) amènent à des longueurs de vecteurs résultats qui diffèrent selon l'option choisie.
%% Cell type:code id: tags:
``` python
a = np.array([1, 1, 1])
c = np.convolve(a,a,'full')
print(c)
c = np.convolve(a,a,'same')
print(c)
c = np.convolve(a,a,'valid')
print(c)
```
%% Output
[1 2 3 2 1]
[2 3 2]
[3]
%% Cell type:markdown id: tags:
Le vecteur `[1, 1, 1]` est souvent nommé "filtre **moyenneur**". En toute rigueur, il faudrait utiliser le filtre $\frac{1}{3}$`[1, 1, 1]` qui, convolué avec un signal, calcule une moyenne glissante sur ce signal. Examinons l'effet de la convolution d'un tel filtre avec convolution d'une forte **discontinuité** par un filtre [1 1 1]. Notons qu'on utilise ici le mode "same" de la convolution pour obtenir un signal de sortie de même longueur que celui d'entrée.
%% Cell type:code id: tags:
``` python
marche_escalier = np.array([0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10])
escalier_lisse = np.convolve(marche_escalier, a, mode='same')
print(escalier_lisse)
```
%% Output
[ 0 0 0 0 0 10 20 30 30 30 30 20]
%% Cell type:markdown id: tags:
### Associativité
**Question 2:** Est-ce que (a$*$a)$*$marche_escalier = a$*$(a$*$marche_escalier) ?
%% Cell type:markdown id: tags:
**Réponse 2:** VOTRE REPONSE ICI
%% Cell type:code id: tags:
``` python
print( np.convolve(escalier_lisse, a, mode='same') )
print( np.convolve(marche_escalier,c, mode='same') )
```
%% Output
[ 0 0 0 0 10 30 60 80 90 90 80 50]
[ 0 0 0 0 0 0 30 30 30 30 30 30]
%% Cell type:markdown id: tags:
**Question 3:** Quel intérêt à cette propriété, si on considère l'application successive de deux convolutions à un signal ?
%% Cell type:markdown id: tags:
**Réponse 3:** VOTRE REPONSE ICI
%% Cell type:markdown id: tags:
### Commutativité
On vérifie que a$*$marche_escalier=marche_escalier$*$a
%% Cell type:code id: tags:
``` python
print( np.convolve (marche_escalier, a))
print( np.convolve (a, marche_escalier))
```