Projet final | Simon Baril-Tessier | Photographie algorithmique - GIF 4105 | H15

introduction - algorithme - résultats - conclusion

Algorithme:

 

La schéma suivant montre l'agorithme de base:

L'interface graphique:

 

Beaucoup d'apprentissage on été réalisés pour dresser l'interface graphique. Le code source est disponible ici, c'est très simple à utiliser !  L'interface fonctionne parfaitement mais n'est pas complète et fonctionne en temps réel. Elle permet la gestion de vidéo en format .mp4. La documentation se trouve dans le code source.

 

Améliorations futures:

 

L'interface n'est pas complète pour la gestion des tailles des images à générer et le temps réel est ordinairement réel... L'outil de segmentation a été implémenté au détriment d'un outil de sélection manuelle qui pourrait, dans quelques cas s'avérer utile.

 

La section vidéo est celle qui demandent le plus d'améliorations. La gestions du format est absente et l'idée de faire une tracking d'un objet entre chaque frame est en projet.

Sommaire des fonctions

-------------------------------------------------------------------------

function ImLoad(handles)

Charge les images et initialise l'interface losrqu'une image est choisie dans le lecteur de fichiers.

 

-------------------------------------------------------------------------

function img_seg = Segmentation(handles)

Pseudo-segmente une image de façon à faire ressortir les groupes de couleurs entre eux. La procédure se base sur cet article (étape3): http://www.mathworks.com/help/images/examples/marker-controlled-watershed-segmentation.html?prodcode=IP&language=en

 

-------------------------------------------------------------------------

function mask = CreateMask(handles)

Crée un masque binaire en fonction du mode choisi. Soit, circulaire:

 

r = sqrt(((x-pos(1)).^2) + ((y-pos(2)).^2));

mask(r < rayon) = 1;

 

linéaire:

% Droites 1 et 2

d1 = single(tan(angle).*x + pos(2) -(pos(1)*tan(angle)) + (rayon/cos(angle)));

d2 = single(tan(angle).*x + pos(2) -(pos(1)*tan(angle)) - (rayon/cos(angle)));

 

% Sélection

mask(y < d1 & y > d2) = 1;

 

et segmentée selon la segmentation définie au préalable

 

-------------------------------------------------------------------------

function FadeMask(handles)

Crée, à partir du masque binaire précédent, un masque dégradé variant de 0 à 1 en fonction de la distance avec les zones en blancs. Deux fonctions sont implémentées, soit un fonction de la distance au caré:

 

masque = distance .^ force

 

et d'une de distance sinusoidale pour un autre type de transition:

 

mask = ((-cos(distance*pi)+1)./2)*force;

 

-------------------------------------------------------------------------

function Bilateral(handles)

Ajoute une pondération aux arrête de l'image dans le masque à partir du gradient

 

mask(mask<1) = mask(mask<1) + grad(mask<1).*bilateral_force;

 

-------------------------------------------------------------------------

function img = ColorImage(handles, img_base)

Colorise une image de façon simple, contraste, saturation et luminosité

 

-------------------------------------------------------------------------

function img_blurred = CreateBlurred(handles, img, taille)

Crée une matrice d'image filtré par un filtre gaussien de dimension "taille" et d'un sigma variant de 0 à 5 selon le nombre de couches désirées

 

-------------------------------------------------------------------------

function img_tilted = ApplyTiltShift(img, mask, img_blurred)

Effectue l'interpolation linéaire entre l'image et les images flouées en fonction d'une pondération

 

for i = 1:n

    blurred = img_blurred(:,:,:,i);

    img(mask<n) = img(mask<n).*(1-mask(mask<n)./n) + blurred(mask<n).*(mask(mask<n)./n);

    img(mask>=n)= blurred(mask>=n);

end

 

Où n égal au nombre couche

 

-------------------------------------------------------------------------

function ShowAll(handles)

Redessine l'interface graphique

 

-------------------------------------------------------------------------

function Preview(handles)

Enregistre et montre l'image dans sa taille native

 

-------------------------------------------------------------------------

function FrameLoad(handles)

Charge une trame du vidéo

 

-------------------------------------------------------------------------

function Batch(handles)

Génère des images filtrées séquentielles

 

-------------------------------------------------------------------------

function SaveVideo(handles)

Enregistre un vidéo en fonction des images créées précédemment