\documentclass[main.tex]{subfiles} \begin{document} \section{Introduction} \subsection{Domaines d'applications} Refaire le graphe stylé en TikZ % \begin{figure}[H] % \centering % \begin{tikzpicture} % \tikzset{every node/.append style={scale=0.5}} % \path[mindmap,concept color=green!50!black, text=white, % level 1/.append style={level distance=3cm}, % level 2/.append style={level distance=1.5cm}] % node[concept](TI) at (0,0){Traitement D'image} % child[grow = 90, concept color = green!75!black]{ % node[concept](ImMed){Imagerie Médicale}[clockwise from = -60] % child{node[concept](seg) {Segmentation}} % child{node[concept](therapie){Therapie}} % child{node[concept](debruit){Débruitage}} % child{node[concept](Imcel){Imagerie Cellulaire}} % child{node[concept](Recal){Recalage}} % child{node[concept](Rec3D){Reconstruction 3D}} % } % child[grow = 0,level distance=5cm, concept color = violet]{ % node[concept](VRob){Vision Robotique} % child[grow=90]{node[concept](Carto) {Cartographie}} % child[grow=0]{node[concept](Ass){Assistance}} % child[grow=-90]{node[concept](VR){VR}} % } % child[grow = -90, concept color = orange]{ % node[concept](Index){Indexation d'image} % child[grow=30]{node[concept](reco) {Reconnaissance de forme}} % child[grow=150]{node[concept](fouille){Fouille d'image}} % child[grow=270]{node[concept](Biomet){Biométrie}} % } % child[grow = 180,level distance=5cm, concept color = violet]{ % node[concept](ImSat){Imagerie satellitaire} % child[grow=180]{node[concept](prev) {Prévisions}} % child[grow=90]{node[concept](Surv){Surveillance}} % }; % \path[mindmap,concept color=brown!80!white!60!green, text=white] % node[concept](Phy) at (-6,4){Physique}; % \path[mindmap,concept color=blue!80!white!60!green, text=white] % node[concept](Algo) at (-6,-4){Algorithmique}; % \path[mindmap,concept color=brown!80!black, text=white] % node[concept](AppStat) at (6,-4){Apprentissage Statistique}; % \path[mindmap,concept color=blue!80!white!60!green, text=white] % node[concept](Opti) at (6,4){Optimisation}; % \begin{pgfonlayer}{background} % \draw (Phy) to[circle connection bar] (ImSat); % \draw (Algo) to[circle connection bar] (ImMed); % \draw (Algo) to[circle connection bar] (Index); % \draw (Phy) to[circle connection bar] (ImMed); % \draw (Opti) to[circle connection bar] (ImMed); % \draw (Opti) to[circle connection bar] (VRob); % \draw (AppStat) to[circle connection bar] (VRob); % \draw (AppStat) to[circle connection bar] (Index); % \draw (seg) to[circle connection bar] (ImSat); % \draw (Surv) to[circle connection bar] (VRob); % \draw (ImSat) to[circle connection bar] (Carto); % \draw (ImSat) to[circle connection bar] (reco); % \draw (reco) to[circle connection bar] (ImMed); % \draw (reco) to[circle connection bar] (ImSat); % \end{pgfonlayer} % \end{tikzpicture} % \caption{Domaines et interface du Traitement d'image} % \end{figure} \subsection{Définion} \begin{defin} \begin{itemize} \item Une \emph{image} est une répresentaiton continue d'une fonction $f(x,y)$ qui relie $f$ à l'intensité lumineuse du point $(x,y)$. \item Une \emph{Image numérique} Échantillonnage $I(x,y)$ dicret (Matrice 2D) de $f$ qui relie $I(x,y)$ à l'intensité lumineuse d'une case $(x,y)$ nommé \emph{pixel}. \item Une Image numérique possède également une \emph{quantification}: nombre de bits pour décrire une couleur /intensité d'un pixel. \end{itemize} \end{defin} \begin{figure}[H] \centering \includegraphics[width=0.7\textwidth]{img/mona_lisa_echantillon.png} \caption{Echantillonage spatial} \end{figure} \begin{figure}[H] \centering \includegraphics[width=0.7\textwidth]{img/mona_lisa_quantif.png} \caption{Quantification} \end{figure} \subsection{Notation et structure} Pour accéder aux pixel d'une image: \begin{itemize} \item $w$ : nombre de colonne $i\in[0,w-1]$ \item $h$ : nombre de lignes $j\in [0,h-1]$ \end{itemize} Ainsi $I(i,j)$ représente la valeur du pixel à la $i$ème colonne et $j$ème ligne. Chaque pixel possède une valeur , quantifié qui peux correspondre à : \begin{description} \item[gris] intensité comme scalaire en $[0,2^n-1]$ où $n$ est la dynamique de l'image (la plupart du temps $n=8$) \item[couleur] Triplet $R,G,B$ , chaque canal correspond à un 'niveau de couleur' codé de meme manière que le gris. \end{description} \subsection{Amélioration d'image} \paragraph{Objectifs} Réhausser le contraste d'une image pour faire apparaitre les objets distinctements. Pour cela on utilise des histogrammes \subsubsection{Histogrammes d'une image} Après quantification on peux compter les pixels de meme valeurs \begin{defin} \begin{itemize} \item Un \emph{histogramme} est une application : \[ H: \begin{cases} [0,N-1] \to [0,wh]\\ H(z) \mapsto card(\{(x,y)\in[0,w]\times [0,h] | I(x,y) = z \}) \end{cases} \] \item On a ensuite \emph{l'histogramme normalisé} : \[ H_n: \begin{cases} [0,N-1] \to [01]\\ H_n(z) \mapsto H(z)/(wh) \end{cases} \] L'histogramme normalisé est une distribution de proba empirique. \item Et \emph{l'histogramme cumulé normalisé} \[ H_{cn}: \begin{cases} [0,N-1] \to [0,1]\\ H_{cn}(z) \mapsto\sum_{k=0}^{z} H_n(k) \end{cases} \] L'histogramme cumulé normalisé est une fonction croissante et une focntion de répartition empirique. \end{itemize} \end{defin} \begin{listing}[H] \begin{minted}{C} int H[N]; // histogramme float Hn[N]; // histogramme cumulé float Hcn[N]; // histogramme cumulé normalisé for (i = 0; i & \\ & \end{bmatrix}}_{\text{ tenseur de structure}} \vect{\Delta x \\ \Delta y} \] \end{prop} \begin{rem} Le tenseur de structure est composé des dérivée de l'image sur le patch moyennée. Les vecteurs propres indiquent les direction principales de variation de gradient dans le voisinage du point (voir l’ellipse du changement constant) \end{rem} \paragraph{Méthode} : On peux calculer $\lambda_1$ et $\lambda_2$ explicitement mais c'est lourd. On préfère utiliser : \[ R = \det(M) - \alpha tr(M)^2 = \lambda_1\lambda_2 -\alpha(\lambda_1+\lambda_2)^2 \] Et on choisi $\alpha \in[0.04; 0.06]$. Les valeurs propres intéressante sont alors des maximums locaux de $R$. \paragraph{Algorithme} \begin{itemize} \item Calcul des gradients gaussien de l'image \item Calcul du tenseur des structures \item Calcul de $R$ \item Seuillage et suppression des valeurs non maximales. \end{itemize} \begin{listing} \inputminted{python}{harris.py} \end{listing} \paragraph{Comment gérer le changement d'échelle ?} Algorithme qui détecte en chaque endroit de l'image l'échelle qui ferait que cet endroit serait un coin. \subsection{Détecteur FAST} \subsection{Détecteur SIFT} \section{La couleur} \subsection{Les descripteurs} En niveaux de gris, le descripteur le plus simple est la luminosité. Un autre descripteur possible (Local Binary Pattern LBP) prend le voisinage 3x3 d'un pixel et fait un seuil des valeurs des pixels par rapport au pixel central. En couleurs, c'est plus complexe car il y a 3 canaux.\\ La couleur n'est pas forcément un atout car l'information supplémentaire n'est pas nécessairement un atout. En général, les algorithmes de traitement de couleurs sont construits pour des applications particulières : par exemple, suppression fond vert.\\ \paragraph{Capteurs RGB} on peut difficilement réaliser un système permettant de séparer les canaux pour les envoyer sur 3 capteurs différents. On réalise donc une matrice du type : \begin{center} \begin{tabular}{cccccc} R & V & R & V & R & V \\ V & B & V & B & V & B \\ R & V & R & V & R & V \\ V & B & V & B & V & B \\ \end{tabular} \end{center} En 1 point donné, on interpole entre les données voisines pour les différents canaux. Il y a plus de capteurs verts car c'est la couleur à laquelle l'oeil humain est le plus sensible.\\ Avantage : l'image RGB a donc la taille d'une image en niveaux de gris. \\ Inconvénient : sur les contours, on aura des aberrations à cause des interpolations. Par exemple, à la frontière entre une zone rouge et une zone verte, on fera apparaître du jaune. \paragraph{Sources lumineuses} on caractérise la lumière de manière spectrale, et on a don une grande variétés de spectres d'émission selon les sources. Donc en ne changeant ni l'objet, ni l'observateur, on peut avoir de grandes différences dans ce qui sera observé en fonction de l'éclairage "ambiant". \paragraph{Perception} l'important n'est pas ce qui compose l'environnement mais la manière dont on le perçoit. Par exemple : un damier sur laquelle une ombre est projetée, le cerveau humain sait que les carrés blancs sont toujours plus foncés que les gris, mais ce n'est pas forcément vrai entre un carré blanc "à l'ombre" et un carré gris dans la lumière. \paragraph{Descripteurs} principe de la trichromie : 3 couleurs primaires permettent de reproduire la quasi-totalité des couleurs \begin{itemize} \item Observateur standard RGB 1931 : il existe une partie négative de la partie rouge, qui n'est pas cohérente avec la théorie additive. \item Observateur standard CIE 1931 : \[ \vect{ X \\ Y \\ Z } = \frac{1}{0.17697} \begin{bmatrix} 0.49 & 0.31 & 0.20\\ 0.17697 & 0.81240 & 0.01063\\ 0 & 0.01 & 0.99 \end{bmatrix} \vect{ R \\ G \\ B } \] Le $Y$ est proche du $V$, le $Z$ est proche du $B$. \end{itemize} \subsection{Seuillage optimal méthode de Otsu} la méthode d'Otsu est utilisée pour effectuer un seuillage automatique à partir de la forme de l'histogramme de l'image1, ou la réduction d'une image à niveaux de gris en une image binaire. L'algorithme suppose alors que l'image à binariser ne contient que deux classes de pixels puis calcule le seuil optimal qui sépare ces deux classes afin que leur variance intra-classe soit minimale. \begin{prop} On cherche le seuil $t$ tel que : \[ \arg\max \omega_1(t)\omega_2(t)[\mu_1(t)-\mu_2(t)]^2 \] Avec: \begin{itemize} \item $\omega_1(t) = \sum_{i=0}^{t}H_n(i)$ \item $\mu_1(t) = \frac{1}{\omega_1(t)}\sum_{i=0}^{t} i \cdot H_n(i)$. \item idem pour $\omega_2$ et $\mu_2$. \end{itemize} \end{prop} \section{Estimation} À partir d'une image on cherche à estimer un ensemble $\theta$ de paramètres (déplacememt, état d'un d'un système ) \paragraph{Source du problème} On ne pas ignorer les outliers et déterminer les paramètre du modèle. Les methodes de tyoe moindres carré sont très sensibles aux outliers à cause de la fonction d'erreur quadratique associée. Différentes approches sont possibles: \subsection{Analyse de l'ensemble des résidus} On utilise des variation de la méthode des moindres carrés: \begin{prop}[Least Median of Squares] On remplace la somme par la médiane : \[ \theta = \arg\min_{\theta}~\text{med } \rho(r_i) \] \end{prop} \begin{prop}[Least Trimmed Squares] On tri les résidus et on en sélectionne $M$ où $N/2 < M< N$. \[ \theta \arg \min \sum_{i=0}^{M}\rho(r_i) \] \end{prop} Une autre alternative est d'utilisé une autre fonction de cout (cf UE 451),qui doit rester symétrique définie positive \subsection{RANSAC} \begin{defin} `` RANSAC, abréviation pour RANdom SAmple Consensus, est une méthode pour estimer les paramètres de certains modèles mathématiques. Plus précisément, c'est une méthode itérative utilisée lorsque l'ensemble de données observées peut contenir des valeurs aberrantes (outliers). Il s'agit d'un algorithme non-déterministe dans le sens où il produit un résultat correct avec une certaine probabilité seulement, celle-ci augmentant à mesure que le nombre d'itérations est grand. L'algorithme a été publié pour la première fois par Fischler et Bolles en 1981'' \end{defin} \begin{figure}[H] \centering \includegraphics[width=0.3\textwidth]{img/ransac_0.png}% \includegraphics[width=0.3\textwidth]{img/ransac_1.png} \includegraphics[width=0.3\textwidth]{img/ransac_2.png}% \includegraphics[width=0.3\textwidth]{img/ransac_3.png} \caption{Méthode RANSAC} \end{figure} \newpage \paragraph{Algorithme}~\\ \textbf{entrées :}\vspace{-1em} \begin{verbatim} data - un ensemble d'observations modele - un modèle qui peut être ajusté à des données n - nb min de données nécessaires pour ajuster le modèle k - nb max d'itérations de l'algorithme t - seuil d'appartenance au modèle d - seuil de données nécessaire pour valider le modèle \end{verbatim} \textbf{sorties :}\vspace{-1em} \begin{verbatim} meilleur_modèle - les paramètres du modèle qui correspondent le mieux aux données meilleur_ensemble_points - données à partir desquelles ce modèle a été estimé meilleure_erreur - l'erreur de ce modèle par rapport aux données \end{verbatim} \begin{listing}[H] \begin{verbatim} itérateur := 0 meilleur_modèle := aucun meilleur_ensemble_points := aucun meilleure_erreur := infini tant que itérateur < k points_aléatoires := n valeurs choisies au hasard à partir des données modèle_possible := paramètres du modèle correspondant aux points_aléatoires ensemble_points := points_aléatoires Pour chaque point des données pas dans points_aléatoires si le point s'ajuste au modèle_possible avec une erreur inférieure à t Ajouter un point à ensemble_points si le nombre d'éléments dans ensemble_points est > d (ce qui implique que nous avons peut-être trouvé un bon modèle, on teste maintenant dans quelle mesure il est correct) modèle_possible := paramètres du modèle réajusté sur ensemble_points erreur := ecart entre données et modèle. si erreur < meilleure_erreur (nous avons trouvé un modèle qui est mieux que tous les précédents, le garder jusqu'à ce qu'un meilleur soit trouvé) meilleur_modèle := modèle_possible meilleur_ensemble_points := ensemble_points meilleure_erreur := erreur incrémentation de l’itérateur retourne meilleur_modèle, meilleur_ensemble_points, meilleure_erreur \end{verbatim} \caption{Algorithme de la méthode randsac} \end{listing} \subsection{La segmentation} \emph{poly de l'ENSTA très bien fait} La segmentation consiste à regrouper les différents pixels de l'image en un nombre (donné) de région (peut aussi consister a une taille de région maximale, les deux, etc...). En pratique on réalise une partition de l'image \subsection{Segmentation par découpage} \begin{defin} L'idée des algorithmes de type « Split \& Merge » est de produire automatiquement une partition initiale en régions petites (Split), qui vont ensuite croître en se regroupant (Merge) \begin{itemize} \item La partition initiale (Split) est réalisée en \emph{divisant récursivement} l'image en régions de tailles identiques lorsqu'un certain critère d'homogéneité n'est pas satisfait: \emph{$R$ est divisée} (ex: si $\sigma_R> seuil$) \item Lors de cette phase, le graphe d'adjacence, ou Region Adjacency Graph (RAG) est créé : à chaque région est associé un sommet du graphe, et des arêtes relient les sommets correspondants à deux régions qui se touchent. \item La \emph{phase de regroupement} (Merge) utilise le RAG pour modifier la partition initiale : pour chaque sommet R du RAG, on cherche s'il existe un sommet $R'$ voisin dans le RAG et de valeur suffisamment proche, et si c'est le cas, on les fusionne: $R et R'$ sont fusionnées si $\mu_{R}-\mu_{R'} < seuil$ \end{itemize} \end{defin} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: "main" %%% End: