+La mise en œuvre de la méthode décrite dans les sections précédentes se fait via la réalisation d'un logiciel doté d'une interface graphique, adaptée aux besoins des utilisateurs et définie conjointement avec Dr. Guy Prod'hom du \emph{CHUV} de Lausanne. L'application doit pouvoir être installée sur des ordinateurs dotés de Windows~7 et de 4~Go de \emph{RAM}.
+
+Pour ce faire la plate-forme \emph{.NET} a été choisie pour ses bonnes performances et sa disponibilité sur les machines cibles. De plus, \emph{Emgu CV} est un \emph{wrapper} \emph{.NET} pour la bibliothèque \emph{Open CV} qui est utilisée pour la manipulation des images.
+
+Le langage de programmation est \emph{F\#}, un langage fonctionnel et orienté objet dérivé d'\emph{Objective Caml} et dérivant lui-même du langage \emph{ML} . Il a été choisi pour sa facilité d'écriture et son haut niveau d'expressivité.
+
+Le code est séparé en deux \emph{assemblies} :
+
+\begin{itemize}
+ \item \emph{ParasitemiaCore} : Bibliothèque contenant la partie calcul.
+ \item \emph{ParasitemiaUI} : Exécutable proposant une utilisation via une interface graphique ou via la ligne de commande.
+\end{itemize}
+
+Pour des raisons de précision numérique, le type \emph{Single} (réel sur 32 bits tel que défini par l'\emph{IEEE 754}) est utilisé pour la représentation de toutes les images intermédiaires à la place d'entier sur 8 ou sur 16 bits. Le processus pouvant prendre une quantité non-négligable de mémoire, le type \emph{Double} (réel sur 64 bits) a été écarté car doublant pratiquement la quantité de mémoire requise.
+
+Le code source ainsi que l'exécutable et un installeur sont disponibles aux adresses suivantes :
+
+\begin{itemize}
+ \item {\parasitemiasource}
+ \item {\parasitemiaexe}
+ \item {\parasitemiasetup}
+\end{itemize}
+
+\subsection{Détails de codage}
+
+\subsubsection{Calculs en parallèle}
+
+Au sein du module \texttt{ParasitemiaCore.Analysis} se trouve la fonction pour lancer l'analyse d'une image :
+
+\begin{lstlisting}[style=fsharp, numbers = none]
+let doAnalysis (img: Image<Bgr, byte>) (name: string) (config: Config) (reportProgress: (int -> bool) option) : Cell list option = [..]
+\end{lstlisting}
+
+Où \texttt{img} est l'image à analyser, \texttt{name} est un nom donné à l'analyse et utilisé dans le \emph{log}, \texttt{config} la configuration et \texttt{reportProgress} une fonction optionnelle qui permettra d'être renseigné de l'avancement de l'analyse à chaque appel en donnant le pourcentage (entre 0 et 100) et qui renverra \texttt{false} pour interrompre l'analyse. La fonction \texttt{doAnalysis} renvoie \texttt{None} si elle a été interrompue, ou une liste de cellules dans le cas contraire.
+
+Une autre version de cette fonction existe dans le même module et permet de traiter en parallèle plusieurs images. Cette fonction est bloquante tant que le traitement de toutes les images n'est pas terminé ou que celle-ci n'a pas été interrompue via le même mécanisme décrit pour \texttt{doAnalysis} ci-dessus.
+
+\begin{lstlisting}[style=fsharp, numbers = none]
+let doMultipleAnalysis (imgs: (string * Config * Image<Bgr, byte>) list) (reportProgress: (int -> bool) option) : (string * Cell list) list option = [..]
+\end{lstlisting}
+
+Une liste d'images est fournie avec un nom associé à chacune d'entre elle ainsi qu'une configuration. L'ordre des résultats retournés n'étant pas forcément le même que celui de la liste d'images, il est nécessaire d'utiliser le nom donné pour associer les résultats aux images données. Comme pour \texttt{doAnalyse}, la fonction renvoie \texttt{None} si elle a été interrompue.
+
+Le nombre de \emph{threads} exécutés en parallèle dépend du nombre de cœurs de la machine.
+
+
+\subsubsection{Ouvertures et fermetures par aire sur des réels}
+\label{algo-ouverture-aire}
+
+\emph{Open CV} ne fournissant pas cette opération, que ce soit sur des entiers ou sur des réels, elle a été implémentée en \emph{F\#}. L'ouverture est détaillée par l'algorithme~\ref{alg:ouverture-par-aire}. Celui-ci est inspiré de l'article~\cite{vincent1992}. La fermeture est similaire mais en inversant l'opérateur d'ordre et en partant des minima à la place des maxima. Nous parlons ici de hauteur et de niveau : un élément plus haut qu'un autre ou de niveau supérieur est dit comme ayant une intensité plus grande.
+
+Les iles sont des ensembles d'éléments 4-connexes. Une ile possède un niveau, et son nombre d'éléments est appelé sa surface. À chaque ile est associé un rivage qui est l'ensemble des éléments 4-connexes à l'ile qui ne font pas parti des éléments de celle-ci. Il doit être possible d'obtenir l'élément le plus élevé appartenant au rivage. Pour ce faire un tas max est utilisé~\cite[p.~140-155]{algo2010}. Ce dernier permet l'ajout et la suppression de l'élément maximum avec temps d'exécution d'ordre $O(log \; n)$.
+
+Un maxima correspond à un ensemble d'éléments de valeur égale dont les voisins 4-connexes qui ne font pas partis du maxima en question ont une valeur strictement plus grande à celui-ci.
+
+\begin{algorithm}
+ \DontPrintSemicolon
+ \caption{Ouverture par aire sur une image contenant des réels.}
+ \label{alg:ouverture-par-aire}
+
+ \SetKwInOut{Input}{Entrée}
+ \SetKwInOut{Output}{Sortie}
+
+ \Input{une image $img$ et une aire $A$}
+ \Output{l'ouvert de $img$}
+ $\mli{iles} \leftarrow $ maxima($img$) \;
+ Initialisation du rivage de chaque ile \;
+ \For{$i \in iles$}{
+ $r \leftarrow i$.rivage.pop\_max \;
+ \uIf{$r$ appartient à une ile $i'$}{
+ \uIf{$i$.surface + $i'$.surface $\geqslant$ $A$ ou $i$.niveau $<$ $i'$.niveau}{
+ Passe à l'ile suivante \;
+ }
+ \Else{
+ $i$.surface $\leftarrow$ $i$.surface $+$ $i'$.surface \;
+ $i$.niveau $\leftarrow$ $i'$.niveau \;
+ Le rivage de $i'$ est ajouté à celui de $i$ et $i'$ est supprimé \;
+ }
+ }
+ \uElseIf{$r$.niveau $>$ $i$.niveau}{
+ Passe à l'ile suivante \;
+ }
+ \Else{
+ $r$ est intégré à $i$ et ses voisins 4-connexe qui ne font ni partie de $i$ ni partie de $i$.rivage sont intégrés à $i$.rivage
+ }
+ }
+ \Return{une copie de $img$ dont les éléments appartenant aux iles sont mis à leur niveau respectif}
+ \BlankLine
+\end{algorithm}
+
+
+
+\subsubsection{Arbre k-d}
+
+\subsection{Interface en ligne de commande}
+
+L'application peut être lancé via la ligne de commande et permet de traiter soit une seule image soit plusieurs simultanément si un dossier est donné. Les paramètres sont les suivants :
+
+\begin{lstlisting}[style=tt]
+ParasitemiaUI.exe (--folder <folder>|--file <file>) --output <folder> [--debug]
+\end{lstlisting}
+
+Où \texttt{---folder <folder>} est un dossier contenant les images à analyser, \texttt{---file <file>} est une image unique à analyser, \texttt{---output <folder>} est un dossier dans lequel seront écrits les résultats et le \emph{log} et \texttt{---debug} un flag permettant d'activer le mode debug dans lequel les images intermédiaires sont écrites dans le dossier de sortie.
+
+
+\subsection{Interface graphique}
+
+Les différents éléments de l'interface graphique, contrôles et fenêtres, sont décrit dans le langage \emph{XAML} et utilisés au sein de \emph{WPF} (\emph{Windows Presentation Foundation}). Au démarrage de l'application, ces fichiers sont chargés via le \emph{type provider} fourni par la bibliothèque \emph{FsXaml.Wpf}, puis les événements sont attachés aux contrôles. Il n'a pas été jugé utile d'utiliser un motif de conception spécifique tel que \emph{MVVM} (\emph{Model-view-viewmodel}) pour ce type d'interface.
+
+La figure~\ref{fig:screenshot-GUI} montre la fenêtre principale à partir de laquelle les principales opérations peuvent être réalisées, comme par exemple charger ou sauvegarder un document, lancer une analyse d'une ou plusieurs images, naviguer au sein de l'image et changer l'état (sain/infecté) des érythrocytes. La parasitémie est affichée dans la partie supérieure, et un message d'avertissement s'affiche si le nombre de cellules analysées est trop faible.
+
+\begin{figure}[htbp]
+ \centering
+ \begin{subfigure}[t]{0.9\textwidth}
+ \includegraphics[width=1\linewidth]{figures/implementation/screenshot-main.jpg}
+ \caption{La fenêtre principale. La parasitémie globale est affichée tout en haut. Les images sources sont affichées à gauche. L'image courante est montrée au centre ainsi que ses informations associées en dessous.}
+% \label{}
+ \end{subfigure}
+ ~
+ \begin{subfigure}[t]{0.55\textwidth}
+ \includegraphics[width=1\linewidth]{figures/implementation/screenshot-start-analysis.jpg}
+ \caption{La fenêtre permettant de lancer une analyse. La résolution (en pixel par pouce) de chaque image doit être entrée préalablement. Des valeurs prédéfinies ainsi qu'un calculateur aident l'utilisateur à trouver la bonne valeur. Ces valeurs sont stockées dans un fichier \emph{JSON} permettant à l'utilisateur de les modifier.}
+% \label{}
+ \end{subfigure}
+ ~
+ \begin{subfigure}[t]{0.35\textwidth}
+ \includegraphics[width=1\linewidth]{figures/implementation/screenshot-ppi-calculator.jpg}
+ \caption{Calcul la résolution de l'image en fonction de la taille du capteur, de sa résolution et du niveau de zoom. De la même manière que les valeurs de résolutions prédéfinies, la liste des différentes tailles de capteurs est stockée dans un fichier \emph{JSON}.}
+% \label{}
+ \end{subfigure}
+ \caption{L'interface graphique de l'application \emph{Parasitemia}.}
+ \label{fig:screenshot-GUI}
+\end{figure}
+
+\subsubsection{Persistance des documents}
+
+Le mode interactif avec interface graphique permet de gérer des documents sous la forme de fichier contenant les images sources ainsi que les résultats de leur analyse. L'extension utilisée est \texttt{PIAZ} pour \emph{ParasitemIA Zipped file}.
+
+Chaque image source est enregistrée au format sans perte \emph{TIFF} en utilisant le modèle de couleur \emph{RGB} et 8 bits par canal. Les noms des images correspondent à leur numéro affiché dans la fenêtre principale, par exemple \texttt{1.tiff}. À chaque image est associé un fichier texte au format \emph{JSON} reprenant le nom du fichier de l'image avec le suffixe \texttt{.json} ajouté, par exemple \texttt{1.tiff.json}. Ce fichier \emph{JSON} contient le nom de l'image, les paramètres et le liste des érythrocytes détectés issue de la dernière analyse. Pour chaque érythrocyte les informations suivantes sont mémorisées :