Commits

Philémon Gardet  committed c511b4f

TP de traitement d'image pour les spe.

  • Participants
  • Parent commits e5b9a94

Comments (0)

Files changed (6)

File tp/traitement d'image/Makefile

-all:
-	rm -rf tmp/*
-	mkdir -p tmp && pdflatex -output-directory tmp sujet-spe.tex

File tp/traitement d'image/gconfs.png

Removed
Old image

File tp/traitement d'image/sujet-spe.tex

-
-\documentclass[a4paper]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[french]{babel}
-\usepackage{fixltx2e}
-\usepackage{nth}
-\usepackage{listings}
-\usepackage{tikz}
-\usepackage{fancyhdr}
-\usepackage[margin=1.0in]{geometry}
-\usepackage{hyperref}
-
-\pagestyle{fancy}
-\lhead{{\sc{OCaml}}\\ {\sc TP-Spé} Traitement d'image - 11 oct. 2013}
-\rhead{{\small \sc{GConfs}}\\ {\sc Epita}}
-\rfoot{\includegraphics[width=0.15\linewidth]{gconfs.png}}
-
- \begin{document}
-\begin{center}
-  {\Large {\bf Le traitement d'image en
-  \textsc{OCaml}}}
-\end{center}
-
-\bigskip
-
-\section*{Introduction}
-
-Ce soir (voir nuit pour les plus téméraires) nous allons nous intéresser au traitement d'images en \textsc{OCaml}, et c'est pour cela que 
-vous êtes restés me direz-vous !\\
-Tout d'abord laissez moi vous dire que durant ce TP nous allons principalement vous introduire les
- bases du traitement d'images afin qu'au final vous soyez capable de réaliser tout le nécéssaire
- pour le pré-traitement d'une image dans un OCR (en gros tout ce dont vous avez besoin pour votre première soutenance).\\
-Le TP sera découpé en plusieurs petits exercices mettant en jeu des traitements d'images divers et variés.\\\\
-Durant ce tp 2 armes seulement vous seront nécéssaires:
-\begin{itemize}
-\item Les bibliothèques SDL (normalement déjà installés sur vos racks)
-\item La documentation de SDL (\url{ocamlsdl.sourceforce.net} partie Ressouces, puis Ocamldoc)
-\end{itemize}
-
-\section{Premiers pas avec SDL}
-\subsection{Le chargement des images}
-\subsection{Jouons avec les pixels}
-\section{Les filtres basiques}
-\subsection{Force rouge, force bleue ...}
-\subsection{Nuance de gris}
-\subsection{Inversion}
-\section{Les filtres avancés}
-
-
-\end{document}

File tp/traitementImage/Makefile

+all:
+	mkdir -p tmp && pdflatex -output-directory tmp sujet-spe.tex
+	mv tmp/sujet-spe.pdf sujet-spe.pdf
+
+clean:
+	rm -rf tmp/*
+
+distclean: clean
+	rm sujet-spe.pdf

File tp/traitementImage/gconfs.png

Added
New image

File tp/traitementImage/sujet-spe.tex

+\documentclass[a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[french]{babel}
+\usepackage{fixltx2e}
+\usepackage{nth}
+\usepackage{listings}
+\usepackage{tikz}
+\usepackage{fancyhdr}
+\usepackage[margin=1.0in]{geometry}
+\usepackage{hyperref}
+
+\pagestyle{fancy}
+\lhead{{\sc{OCaml}}\\ {\sc TP-Spé} Traitement d'image - 11 oct. 2013}
+\rhead{{\small \sc{GConfs}}\\ {\sc Epita}}
+\rfoot{\includegraphics[width=0.15\linewidth]{gconfs.png}}
+
+ \begin{document}
+\begin{center}
+  {\Large {\bf Le traitement d'image en
+  \textsc{OCaml}}}
+\end{center}
+
+\bigskip
+
+\section*{Introduction}
+
+Ce soir (voir nuit pour les plus téméraires) nous allons nous intéresser au traitement d'image en \textsc{OCaml}, et c'est pour cela que 
+vous êtes restés me direz-vous !\\
+Durant ce TP nous allons principalement introduire les
+ bases du traitement d'images afin qu'au final vous soyez capable de réaliser quasiment tout le nécéssaire
+ pour le pré-traitement d'une image dans un OCR.\\\smallskip
+Le TP sera découpé en plusieurs petits exercices mettant en jeu des traitements d'images divers et variés.\\\\
+Durant ce TP 2 armes seulement vous seront nécéssaires:
+\begin{itemize}
+\item Les bibliothèques SDL (normalement déjà installés sur vos racks)
+\item La documentation de SDL (\url{http://ocamlsdl.sourceforge.net/doc/html})
+\end{itemize}
+
+
+\section{Premiers pas avec SDL}
+\subsection{L'initialisation de SDL}
+Avant de pouvoir commencer ce TP, la moindre des choses serait d'initialiser SDL :
+
+\begin{verbatim}
+  Sdl.init ['VIDEO]
+\end{verbatim}
+
+Notez que pour ce TP nous initialiserons SDL avec 'VIDEO et non 'EVERYTHING : nous n'avons besoin que de modifier des images donc seulement de manipuler des surfaces.
+
+
+\subsection{Le chargement et la sauvegarde des images}
+Avant toute chose, pouvoir ouvrir sur une image serait une bonne chose, mais comment charger une image pour l'utiliser dans mon code me direz-vous ?
+Et bien c'est très simple, SDL intègre une fonction natif pour charger des images au format bitmap. Attendez ne partez pas ! Avec SDL il est également posible de charger du jpeg, du png voir même du tiff, cela grâce à un sous-module de SDL : Sdlloader.\\\smallskip
+Ainsi les fonctions qui vous aiderons pour charger une image sont :
+
+\begin{verbatim}
+  val Sdlvideo.load_BMP : string -> surface
+  val Sdlloader.load_image : string -> surface
+\end{verbatim}
+
+\noindent
+Par contre pour la sauvegarde d'une image Sdl ne pourra gérer le format bitmap :
+
+\begin{verbatim}
+  val Sdlvideo.save_BMP : surface -> string -> unit
+\end{verbatim}
+
+
+\subsection{Jouons avec les pixels}
+
+Maintenant que nous avons notre image essayons de la modifier. Abordons les fonctions qui traitent de la chose.\par\bigskip
+
+La première chose à faire avant de manipuler une image comme on s'apprête à le faire, c'est de verrouiller la surface en memoire. Si cette fonction n'est pas utilisée SDL rencontrera de sérieux problèmes optimisation et prendra un certain temps à faire les modifications.
+
+\begin{verbatim}
+  val lock : surface -> unit
+  val unlock : surface -> unit
+\end{verbatim}
+
+\noindent
+Cela fait voici les fonctions permettantes de modifier les pixels (enfin...).
+
+\begin{verbatim}
+  val get_pixel_color : surface -> x:int -> y:int -> color
+  val put_pixel_color : surface -> x:int -> y:int -> unit
+\end{verbatim}
+
+\section{Les filtres basiques}
+
+Nous allons enfin pouvoir commencer la partie intéréssante !\\
+Les fonctions de cette partie seront faites, sauf contre indication, selon le prototype suivant :
+
+\begin{verbatim}
+  val filtre : surface -> unit
+\end{verbatim}
+
+
+\subsection{Force rouge, force bleue ...}
+Les premiers filtres vont consister en des filtres de couleurs :\\
+\begin{itemize}
+\item Écrivez un filtre qui ne garde que les pixels rouges.
+\item Puis un filtre qui met une des composantes RGB (Red Blue Green) à zéro selon la string 
+passée en paramètre ("blue" pour enlever toute trace de bleu)
+
+\begin{verbatim}
+val discard : surface -> string -> unit
+\end{verbatim}
+
+\item Ecrivez une fonction qui inverse toutes les couleurs de votre image (par exemple si la composante bleue est à 242 elle passe à 13)
+
+\item Enfin faîtes un filtre noir ou blanc. Les pixels n'ont pas le droit d'être d'une autre couleur, à vous de trouver le juste milieu.
+
+\end{itemize}
+\subsection{Nuance de gris}
+
+En premier lieu ecrivez une fonction qui fait la moyenne de chacune de vos composantes et qui remplace cette moyenne par les valeurs des comosantes.
+
+Ensuite trouvez le moyen de faire un filtre de niveau de gris qui rende compte de la manaière dont l'oeil humain perçoit les composantes RGB (Cf: Wikipedia, Niveau de gris)
+
+\section{Les filtres avancés}
+\subsection{Les matrices de convolution}
+Malgré le nom barbare que portent ces pauvres matrices, celles-ci nous sont bien utiles pour le traitement d'image.\\
+Mais commençons par le commencement. Qu'est-ce qu'une matrice de convolution ?\\
+En traitement d'image il existe une technique assez répendue qui consiste à créer une matrice pour chaque pixel plus les 8 pixels alentours.
+C'est-à-dire que lorsque l'on traite un pixel, on utilise une matrice (ici 3x3) dont il est le centre.\\
+Ensuite on effectue une opération avec une matrice de convolution (appelé aussi noyau). Cette opération consiste généralement 
+à faire la multiplication de chacun des termes des 2 matrices respectives puis de sommer le tout pour attribuer cette valeure au pixel étudié.\par\smallskip
+Grossièrement: 	\begin{math}
+		P = \Sigma ( M(i,j) \times  N(i,j) )
+		\end{math} \par\smallskip
+Avec P le pixel, M la matrice initiale et N la matrice de convolution (noyau).\par\bigskip
+
+Tout d'abord écrivez la fonction permettant de récuperer une matrice à partir d'un pixel.
+(attention: Certains pixels n'ont pas forcément 8 voisins.)
+
+\subsubsection{Filtre d'approximation}
+A partir ce cet algorithme, écrivez une fonction qui pour chaque pixel calcule la moyenne de chaque composante des 9 pixels et donne ce code RGB au pixel étudié.
+\subsubsection{Filtre de Tuckey}
+Maintenant il s'agit de récuperer chacune des composantes RGB, de les mettre séparément dans des listes, 
+vecteurs ou ce que vous souhaitez, puis puis donnez respectivement comme compossantes au pixel courant la médiane de chacune des couleurs.
+\subsubsection{Convolution à volonté}
+L'idée est de créer une fonction qui applique une matrice de convolution passée en paramètre comme filtre de l'image.
+
+\section{Vous êtes sur la bonne voie !}
+Vous êtes maintenant capable d'implémenter des filtres utiles (que l'on ne me dise pas que ce qui était avant n'était pas utile) et intéréssants.
+Parmis eux nous vous conseillons de chercher:
+\begin{itemize}
+\item Les filtres de filtrages du bruit (Ex: Canny)
+\item Les filtres de detection de contour (Ex: Sobel, Canny)
+\item Opérateurs morphologiques (Cf: Wikipedia, Morphologie mathématique)
+\item Le tramage (Ex: Bayer, Halftone, Floyd–Steinberg)
+\end{itemize}
+
+\end{document}