Skip to content
Snippets Groups Projects
Verified Commit 5b8401ae authored by orestis.malaspin's avatar orestis.malaspin
Browse files

mises à jour

parent 04e0dc17
No related branches found
No related tags found
No related merge requests found
Pipeline #12874 passed
......@@ -36,20 +36,24 @@ Le but de ce travail pratique est d'implémenter les méthodes numériques de ca
afin de les comprendre de façon un peu plus approfondie. Puis, il faudra utiliser ces méthodes pour calculer
des convolutions afin de filtrer un signal.
Aucun langage particulier n'est imposé. Il est recommandé d'utiliser octave ou python (en particulier les librairies numpy/scipy/matplotlib).
Vous devrez rendre un petit rapport (3-4 pages) qui explique ce que vous avez fait et dans quel but. Il devra contenir
une courte introduction théorique (rappelant les formules et le but du travail), une partie expliquant dans les grandes lignes
Le noyau de calcul de votre travail pratique doit être réalisé en C et il doit être compilable avec
un `Makefile`. Pour la réalisation de graphiques vous êtes libres d'utiliser
l'outil de votre choix (la librairie matplotlib par exemple). Certaines visualisations
peuvent être faites à l'aide de la librairie SDL pour obtenir un bonus.
Vous devrez rendre un petit rapport (environ 10 pages) qui explique ce que vous avez fait et dans quel but. Il devra contenir
en premier lieu une introduction générale à votre travail qui peut être comprise par n'importe qui.
Puis une courte introduction théorique (rappelant les formules et le but du travail), une partie expliquant dans les grandes lignes
des algorithmes (pas de copier-coller du code, pas de captures d'écran non plus sous peine de sanctions terribles).
La partie importante est celle contenant les résultats obtenus et leur discussion. Finalement, il faut inclure
une conclusion résumant votre travail.
Le travail doit être effectué par groupes de deux
(n'oubliez pas de mentionner les deux noms sur le rapport et dans le code si le travail est fait à deux).
Le travail doit être effectué par groupes de deux (oui c'est une obligation).
N'oubliez pas de mentionner les deux noms sur le rapport et dans le code.
Je dois pouvoir exécuter le code
afin de pouvoir reproduire les résultats présentés dans le rapport (un petit *readme* pour les instructions est le bienvenu).
Je dois aussi pouvoir définir ma propre fonction à intégrer de façon simple.
Le rapport et le code doivent être déposés sur cyberlearn.
Le rapport et le code doivent être déposés sur `Cyberlearn` et `gitedu` respectivement.
La note sera une combinaison entre le code rendu et le rapport (moitié/moitié).
......@@ -66,27 +70,34 @@ un nombre de subdivisions $N$. Le code devra rendre la valeur numérique obtenue
I(a,b,N,f(x)) \cong \int_a^bf(x)\dd x
\end{equation}
pour deux méthodes vues en cours (méthode du rectangle à gauche, et méthode du trapèze)[^1].
Dans le cas de la méthode du rectangle à gauche on a
\begin{equation}
I(a,b,N,f(x))=\sum_{i=0}^N-1 f(a+i\delta x)\delta x,\quad \delta x=\frac{b-a}{N}.
\end{equation}
## Étude de l'erreur
## Validation
Lorsqu'on calcule numériquement une intégrale, on espère que la valeur de celle-ci *converge*, c'est-à-dire
Lorsqu'on calcule numériquement une intégrale, on souhaite que la valeur de celle-ci *converge*. C'est-à-dire
que plus $N$ est grand, plus la valeur de l'approximation est bonne. Pour vérifier que cela se passe avec nos
méthodes d'intégration, vous devrez effectuer une étude de l'erreur de vos méthodes d'intégration numériques.
Pour ce faire, nous choisissons une fonction $f(x)$
dont la primitive est simple à calculer
\begin{equation}
f(x)=-\frac{2x-1}{\exp(x^2-x+2)},
\end{equation}
\end{equation}3
et un intervalle sur lequel la fonction est bien définie. Choisissons ici $[a,b]$ avec $a=1$ et $b=5$.
On peut donc calculer l'intégrale exactement (analytiquement) et on notera ce résultat exact $I_{exact}(a,b,f(x))$.
On peut donc calculer l'intégrale exactement (analytiquement) et on notera ce résultat exact $I$
\begin{equation}
I=\int_a^b-\frac{2x-1}{\exp(x^2-x+2)}\mathrm{d}x.
\end{equation}
Puis, il faut calculer l'erreur commise par l'évaluation de la fonction $I(a,b,N,f(x))$
pour $N=5, 10, 50, 100, 500, 1000$ pour chacune des méthodes que vous avez implémentées ci-dessus.
L'erreur $E(N)$ se calcule de la façon suivante
\begin{equation}
E(N)=\left|\frac{I_{exact}(a,b,f(x))-I(a,b,N,f(x))}{I_{exact}(a,b,f(x))}\right|
E(N)=\left|\frac{I-I(a,b,N,f(x))}{I}\right|
\end{equation}
Ces résultats devront être illustrés sous forme de graphique ($E$ en fonction de $N$ en échelle log-log).
Que constatez-vous? Pouvez-vous mesurer le taux de décroissance de l'erreur?
Que constatez-vous? Pouvez-vous mesurer le taux de décroissance de l'erreur (a.k.a. l'ordre de l'erreur)?
# Convolutions et filtrage
......@@ -107,12 +118,14 @@ f(x)=\left\{\begin{array}{ll}
0,&\mbox{ sinon.}
\end{array}\right.
\end{equation}
Afin de se familiariser un peu avec ces deux fonctions, ne pas hésiter à les dessiner
Afin de se familiariser un peu avec ces deux fonctions, dessiner les
pour différentes valeur de $\omega_1$, $\omega_2$, et $\psi$.
Puis, calculer analytiquement (à la main avec du papier et un crayon[^2]) la convolution $(f\ast s)(x)$.
A partir du résultat de la convolution, déterminer la relation entre $\psi$ et $\omega_1$ (respectivement $\omega_2$)
pour enlever complètement la composante $\omega_1$ (respectivement $\omega_2$) du signal $s(x)$.
Puis, calculer analytiquement (à la main avec du papier et un crayon[^2]) la convolution $(f\ast s)(x)$ (rappelez vous qu'on
a fait des choses similaires en cours).
Ensuite, on souhaite filtrer $s$ à l'aide de $f$. Pour cela, on veut "enlever" totalement
la partie $\omega_1$ (ou $\omega_2$) de $f\ast s$. En choisissant astucieusement $\psi$
on se rend compte que cela est plus simple qu'il n'y paraît!
Utiliser ces relations pour illustrer le filtrage de $s(x)$ pour différentes valeurs de $\omega_1$ et $\omega_2$.
### La convolution discrète
......@@ -130,7 +143,7 @@ Voyez-vous des différences?
### Théorie
Dans le cadre de ce tp, nous allons nous concentrer sur la convolution discrète d'un signal discret en deux dimensions. Pour représenter notre signal discret en deux dimmensions, nous pouvons utiliser des matrices. Par exemple :
Dans le cadre de ce tp, nous allons nous concentrer sur la convolution discrète d'un signal discret en deux dimensions. Pour représenter notre signal discret en deux dimensions, nous pouvons utiliser des matrices. Par exemple :
\begin{equation}
\label{eqn:mat_exemple}
......@@ -147,7 +160,7 @@ b_{2,-2} & b_{2,-1} & b_{2,0} & b_{2,1} & b_{2,2}
\end{pmatrix}
\end{equation}
Une image matricielle peut être interpétée comme un signal discret en deux dimmensions.
Une image matricielle peut être interprétée comme un signal discret en deux dimensions.
Pour rappel, la formule du produit de convolution en 1 dimension d'un signal discret est :
......@@ -155,7 +168,7 @@ Pour rappel, la formule du produit de convolution en 1 dimension d'un signal dis
(s\ast u)[t] =\sum_{n=-N}^{+N} s[n]\cdot u[t-n]
\end{equation}
Lorsque l'on rajoute une nouvelle dimmension la formule devient, avec $-M$ l'indice de ligne le plus petit de la matrice $\mat{A}$, et $+M$ le plus grand, ainsi que $-N$, $+N$ pour les indices de colonne :
Lorsque l'on rajoute une nouvelle dimension la formule devient, avec $-M$ l'indice de ligne le plus petit de la matrice $\mat{A}$, et $+M$ le plus grand, ainsi que $-N$, $+N$ pour les indices de colonne :
\begin{equation}
(\mat{A}\ast \mat{B})[i,j] =\sum_{m=-M}^{+M}\sum_{n=-N}^{+N} \mat{A}[m, n]\cdot \mat{B}[i-m,j-n]
......@@ -178,9 +191,15 @@ Si l'on essaye de calculer $(\mat{A}\ast \mat{B})[2,2]$, on découvre qu'il nous
### Exercice
Vous allez devoir implémenter une solution de traitement d'images en nuances de gris basé sur la convolution de signal en deux dimmensions. Le language imposé est le C. Vous devrez rendre le code ainsi qu'un rapport succint (moins de 8 pages par groupe).
Au risque de se répéter, rappelons quelques contraintes administratives.
Pour commencer, vous devrez implémenter un outil permettant de lire des images au format PGM. Vous utiliserez le format binaire pour stocker la valeur de vos pixels. Votre programme devra respecter les spécifications du format PGM ([http://netpbm.sourceforge.net/doc/pgm.html](http://netpbm.sourceforge.net/doc/pgm.html)).
Vous allez devoir implémenter une solution de traitement d'images en nuances de gris basé sur la convolution de signal en deux dimensions
par groupe de deux. Le language imposé est le C. Vous devrez rendre le code sur `gitedu` ainsi qu'un rapport succinct sur `Cyberlearn` (moins de 10 pages par groupe).
Pour commencer, vous devrez implémenter un outil permettant de lire des images au format PGM
(n'hésitez pas à réutiliser celui que vous avez déjà implémenté en programmation séquentielle).
Vous utiliserez le format binaire pour stocker la valeur de vos pixels.
Votre programme devra respecter les spécifications du format PGM ([http://netpbm.sourceforge.net/doc/pgm.html](http://netpbm.sourceforge.net/doc/pgm.html)).
Pour visualiser votre image, vous pouvez à choix l'afficher avec la librairie SDL (bonus sur la note finale) ou alors la sauvegarder au format PGM, et utiliser un outil compatible (par ex: ImageMagick).
......@@ -204,7 +223,7 @@ Calculez à la main le produit de convolution de ces deux matrices, en utilisant
#### Partie 2
Appliquez les 5 filtres ci-dessous en faisant le produit $\mat{F_n}\ast \mat{\mathcal{I}}$, où $\mat{\mathcal{I}}$ est l'image "part2.pgm" jointe à l'énnoncé. Expliquez avec vos mots l'effet de ces filtres, est essayant d'être le plus descriptif possible (évitez les phrases de 3 mots).
Appliquez les 5 filtres ci-dessous en faisant le produit $\mat{F_n}\ast \mat{\mathcal{I}}$, où $\mat{\mathcal{I}}$ est l'image "part2.pgm" jointe à l'énoncé. Expliquez avec vos mots l'effet de ces filtres, est essayant d'être le plus descriptif possible (évitez les phrases de 3 mots).
\begin{equation*}
\mat{F_0} = \begin{pmatrix}
......@@ -241,9 +260,10 @@ Appliquez les 5 filtres ci-dessous en faisant le produit $\mat{F_n}\ast \mat{\ma
\end{equation*}
\newpage
#### Partie 3
Récupérez sur cyberlearn l'image nommée "part3_\<n\>.pgm", où n est votre numéro de groupe. Cette image a été fortement bruitée, heureusement (quelle chance vraiment :)), le bruit est périodique, et peut être supprimé à l'aide d'un filtre moyenneur.
Récupérez sur cyberlearn l'image nommée `part3_<n>.pgm`, où `n` est votre numéro de groupe. Cette image a été fortement bruitée, heureusement (quelle chance vraiment :)), le bruit est périodique, et peut être supprimé à l'aide d'un filtre moyenneur.
\begin{equation*}
\mat{F} = \frac{1}{9}\begin{pmatrix}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment