\documentclass[10pt]{article}
\usepackage[left=2.5cm,top=2cm, textwidth=16cm, textheight=24.cm, headheight=0cm,headsep=0.5cm,foot=1cm]{geometry}                % See geometry.pdf to learn the layout options. There are lots.
\geometry{letterpaper}                   % ... or a4paper or a5paper or ... 
%\geometry{landscape}                % Activate for for rotated page geometry
%\usepackage[parfill]{parskip}    % Activate to begin paragraphs with an empty line rather than an indent
\usepackage{graphicx}
\usepackage{dsfont}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{array}
\usepackage{graphicx}     
\usepackage{pgfplots}  
\usepackage{pgf,tikz}

\usepackage{epstopdf}
\DeclareGraphicsRule{.tif}{png}{.png}{`convert #1 `dirname #1`/`basename #1 .tif`.png}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage[parfill]{parskip}
\usepackage{pifont}
\usepackage{marvosym}

\title{\textbf{TP 3 : Morphologie mathématique}}
\date{}                                           % Activate to display a given date or no date


\usepackage{xstring}

\hyphenation{op-tical net-works semi-conduc-tor}



\newcommand{\code}[1]{
\begin{center}
\colorbox{black!10}{\begin{minipage}{0.95\textwidth}
\tt{#1}
\end{minipage}}
\end{center}
\medskip}

\def\bI{\mathrm{\mathbf{I}}}
\def\bH{\mathrm{\mathbf{H}}}
\def\bB{\mathrm{\mathbf{B}}}
\def\bJ{\mathrm{\mathbf{J}}}

\newcounter{ManipCounter}

\newcommand{\Manipulation}[1]{%
\addtocounter{ManipCounter}{1}%
\medskip
\textbf{Manipulation \arabic{ManipCounter}~}%
-----------------------------------------------------------------------------------------------------------------\\ 
#1\\
-----------------------------------------------------------------------------------------------------------------------------------------
\medskip
}

\newcommand{\ManipulationDix}[1]{%
\addtocounter{ManipCounter}{1}%
\medskip
\textbf{Manipulation \arabic{ManipCounter}~}%
---------------------------------------------------------------------------------------------------------------\\ 
#1\\
-----------------------------------------------------------------------------------------------------------------------------------------
\medskip
}


\newcounter{PrepaCounter}

\newcommand{\Preparation}[1]{%
\addtocounter{PrepaCounter}{1}%
\textbf{Preparation \arabic{PrepaCounter}~}------------------------------------------------------------------------------------------------------------------\\
#1\\
-----------------------------------------------------------------------------------------------------------------------------------------\\
}

\def\chevrons{>\! \!>~}



\begin{document}
\maketitle
\vspace{-1cm}

Dans ce TP nous allons nous intéresser à une image de globules rouges observés au microscope. Nous allons mettre en oeuvre des techniques simples de seuillage d'histogramme et de morphologie mathématique pour extraire de l'image les pixels appartenant aux globules rouges.



\section{Quelques rappels avant de commencer}

\subsection{Seuillage d'histogramme}
\label{subsec:histogramme}

Lorsque l'on souhaite effectuer une segmentation binaire, \textit{i.e.} classer les pixels d'une image en niveaux de gris dans deux classes distinctes, l'outil le plus simple est le seuillage de l'histogramme. Le choix de la valeur de seuil influence le résultat de la segmentation. On peut le choisir "à la main" lorsqu'il est évident, ou utiliser des méthodes de seuillage qui déterminent automatiquement le seuil. Dans ce TP nous nous intéresserons à la méthode de seuillage automatique qui détermine de manière itérative la valeur de seuil en se basant sur la stabilité de la moyenne des niveaux de gris des deux classes constituées par le seuil $T$. L'algorithme de seuillage automatique est rappelé ci-dessous.


\textbf{Algorithme : }
\begin{enumerate}
\item Calcul de l'histogramme de l'image.
\item Initialisation : sélectionner un seuil initial $T^{(0)}$ et constituer les groupes $G_1^{(0)}$ et $G_2^{(0)}$..
\item A l'itération $k$ : calculer des intensités moyennes $m_1^{(k)}$ et $m_2^{(k)}$ des groupes $G_1^{(k)}$ et $G_2^{(k)}$.
\item Calcul du nouveau seuil $T^{(k)} = (m1^{(k)} + m2^{(k)})/2$.
\item Répéter les étapes 4 et 5 jusqu'à ce que les variations de $T$ soient inférieures à $\epsilon$ (défini par l'utilisateur).
\end{enumerate}


\subsection{Fonctions Matlab pour la morphologie mathématique}

Tous les opérateurs morphologiques vu en cours sont implémentés dans la toolbox \textit{Image Processing} de Matlab. On donne ici un aperçu des principales fonctions utiles. 


\code{
\chevrons SE = strel('disk', R, N); \# élément structurant en forme de disque de rayon R. \\
\phantom{\chevrons SE = strel('disk', R, N); \# }N sera fixé à 0 dans ce TP. \\
\chevrons SE = strel('square', W); ~\# élément structurant carré de taille W $\times$ W.\\
\chevrons im2 = imdilate(im, SE); ~~\# dilatation de l'image binaire im avec SE. \\
\chevrons im2 = imerode(im, SE); ~~~\# érosion de l'image binaire im avec SE. \\
\chevrons im2 = imopen(im, SE); ~~~~\# ouverture de l'image binaire im avec SE. \\
\chevrons im2 = imclose(im, SE); ~~~\# fermeture de l'image binaire im avec SE. \\
\chevrons im2 = bwhitmiss(im, X, Wx); \# Transformée tout-ou-rien de l'image binaire im\\
\phantom{\chevrons im2 = bwhitmiss(im, X, Wx); ~\#}avec les formes X et Wx = W-X (cf. cours).
}

Il est aussi possible de définir soi-même un élément structurant en créant une matrice remplie de 0 pour le fond et de 1 pour la forme de l'élément structurant.

\break

\section{Seuillage d'histogramme}

Tout au long de ce TP, nous allons travailler sur l'image 'globules.jpg'.

\subsection{Afficher l'histogramme de l'image}
Sous Matlab, la fonction $\tt{imhist}$ permet de calculer et d'afficher l'histogramme d'une image.


\Manipulation{\ding{229} Charger et afficher l'image 'globules.jpg'.\\
\ding{229} Calculer son histogramme à l'aide de la fonction $\tt{imhist}$.
}



\subsection{Méthode de seuillage automatique}

\Manipulation{\ding{229} Implémenter la méthode de seuillage automatique d'histogramme vue en cours et rappelée dans le paragraphe \ref{subsec:histogramme}.
}

Pour implémenter la méthode de seuillage automatique d'histogramme, vous aurez besoin d'utiliser une boucle $\tt{while}$ : 

\code{while 'condition'\\
\phantom{~~~ }instruction1\\
\phantom{~~~ }instruction2\\
\phantom{~~~ }... \\
end}
La condition à tester peut être une égalité $\tt{A == B}$, une différence $\tt{A \sim= B}$ ou encore une inégalité $\tt{A >= B}$.


\subsection{Création de l'image binaire}

Sur l'image 'globules.jpg', les objets d'intérêt, les globules rouges, apparaissent en niveaux de gris foncé sur fond clair. Pour effectuer les opérations morphologiques, on préfère travailler sur une image binaire où les objets sont en blanc et le fond en noir.

\Manipulation{\ding{229} Transformer l'image binaire obtenue après seuillage automatique pour obtenir les objets en blanc (valeur des pixels = 1) et le fond en noir (valeur des pixels = 0).
}

\section{Amélioration de l'image binaire grâce aux opérateurs morphologiques}

\subsection{Rebouchage des trous}
\Writinghand~ Proposer un traitement morphologique qui permette de combler les trous à l'intérieur des objets d'intérêt. Justifier les choix d'opérateur(s) et d'élément(s) structurant(s).

\Manipulation{\ding{229} Implémenter la méthode proposée.
}

\Writinghand~ Commenter le résultat obtenu.

\subsection{Suppression des objets qui ne sont pas des globules}
\Writinghand~ Proposer un traitement morphologique qui supprime les objets qui ne sont pas des globules rouges. Justifier les choix d'opérateur(s) et d'élément(s) structurant(s).

\Manipulation{\ding{229} Implémenter la méthode proposée.
}

\Writinghand~ Commenter le résultat obtenu.

\subsection{Affichage de l'image originale restreinte aux globules rouges détectés}

\Writinghand~ On souhaite maintenant afficher les globules rouges détectés avec les niveaux de gris originaux. Comment faire à partir de l'image binaire pour réaliser cette opération ? 

\Manipulation{\ding{229} Afficher le résultat sous Matlab.
}


\end{document}