Ceci est une ancienne révision du document !
%-------------------------------------------------------------------------%
% Traitement de l'image %
% %
% Ce premier fichier est le pogramme de traitement. Il lit une image, %
% puis appelle differentes fonctions afin de la traiter. %
Im = imread('nom_fichier.jpg'); %Im : variable contenant 3 matrices qui
%contiennent les intensites de rouge, vert
%pour chaque pixel de l'image de base
mint = [135 29 69]; %Cette variable correspond a un pixel du rayon ayant la
%plus intensite (prise de maniere completement
%empirique
image(Im) %Affichage de l'image de base
imf = faisceau(Im, mint); %appelle de la fonction faisceau, resultat stocke
%dans imf (plus d'explication dans le fichier
%faisceau.m)
figure %nouvelle fenetre pour une figure
image(imf) %affichage de l'image imf ne selectionnant que le faisceau
[imf2, zx] = affinage(imf); %appelle de la fonction affinage. imf2 est une
%image et zx une matrice 2xp, p etant la
%largeur de l'image (plus d'explication dans le
%fichier affinage.m)
figure %nouvelle fenetre pour une figure
image(imf2) %affichage de l'image imf2
[imech, ech] = echelle(Im); %appelle de la fonction echelle. imech est une
%image et ech un flottant (plus d'explication
%dans le fichier affinage.m)
figure %nouvelle fenetre pour une figure
image(imech) %affichage de l'image imech
res = pos_deriv(ech, zx, 0, 0.1); %appelle de la fonction pos_deriv. res
%est une matrice nx5 (plus d'explication
%dans le fichier affinage.m)
figure %nouvelle fenetre pour une figure
plot(res(:,1), res(:,2)) %graphe du faisceau
save('nom_fichier.txt', 'res', '-ascii'); %ecrit les donnes de res dans un
%fichier .txt
%-------------------------------------------------------------------------%
function [ image_fais ] = faisceau( im, min )
%FAISCEAU Mat(3*Mat(int)) * Mat(int) -> Mat(3*Mat(int))
% Retourne une image ne selectionnant "theoriquement" que le faisceau du
% laser grace a la coueur rouge et prend en argument l'image de depart et
% le pixel minimal
n= size(im,1); %nombre de ligne
p= size(im,2); %nombre de colonne
im = uint8(im); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
image_fais= zeros(n,p,3); %initialise l'image en noir complet
image_fais = uint8(image_fais); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
I = 1:n;
J = 1:p;
for i = I
for j = J
if im(i,j,1)>min(1)-1 %selection de la couleur rouge
image_fais(i,p+1-j,1)=im(i,j,1); %mise a l'endroit
end
end
end
end
%-------------------------------------------------------------------------%
function [ imf, xm ] = affinage( im )
%AFFINAGE Mat(3*Mat(int)) -> Mat(3*Mat(int)) * Mat(int)
% Retourne l'image en moyennant les positions verticales des pixels rouges
%pour avoir un trait fin et le tableau contenant ces valeurs et
%l'ecart entre la valeur max et la valeur min en valeur absolue et prend en
%argument l'image avec seulement le faisceau
n= size(im,1); %nombre de ligne
p= size(im,2); %nombre de colonne
im = uint8(im); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
xm=zeros(2,p); %initizalisation d'une matrice 2xp
I = 1:n;
J = 1:p;
%-------------------------------------------------------------------------%
%Remplissage du tableau xm
for j = J
s=0; %
x=0; %initialisation de 3 variables
sx = 0; %
for i = I
if im(i,j, 1) > 0 %Un pixel non noir
if x == 0 %verification pour la premiere valeur
xmin = i; %Recuperation de la position du coefficent
%minimale
end
x = x+i; %
xmax = x-sx; % Pour le calcul de la posisition maximale qui
sx=sx+i; % doit se faire a chaque boucle
s=s+1; %Somme pour le calcul de la moyenne
end
end
ecart = abs(xmin-xmax)/2; %calcul de l'ecart entre valeur max et min
xm(1,j)=floor(x/s); %un pixel doit être un entier
xm(2,j)=ecart;
end
%-------------------------------------------------------------------------%
imf = zeros(n,p,3); %initialisation de l'image contenant le trait fin du
%faisceau
%-------------------------------------------------------------------------%
% Elimination des valeurs tres aberantes
x=xm(1,p-1);
xm(1,p)=x;
test = xm(1,p);
for j=2:p
if abs(xm(1,p+1-j)-test)>8
xm(1,p+1-j)=NaN; %La valeur NaN permet de faire en sorte que la
%valeur ne sera pas prise en compte lors des
%prochains calculs
else
test = xm(1,p+1-j);
end
end
%-------------------------------------------------------------------------%
imf = uint8(imf); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
%-------------------------------------------------------------------------%
%Creation du faisceau affine dans une nouvelle image
for j = J
if xm(j)>0
imf(xm(1,j), j,1)=255;
end
end
end
%-------------------------------------------------------------------------%
function [ image_ech, ech] = echelle( im )
%ECHELLE Mat(3*Mat(int)) -> Mat(3*Mat(int)) * float
% Renvoie une image avec seulement le carre temoin en vert ainsi que
% l'echelle correspondant et prend en argument l'image de base
im = uint8(im); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
n= size(im,1); %nombre de ligne
p= size(im,2); %nombre de colonne
cbv = 60; %Intensite minimale du vert sur le carre blanc prise
%empiriquement
image_ech= zeros(n,p,3); %initialise l'image en noir complet
image_ech = uint8(image_ech); %convertit l'image pour que l'intensite
%varie de 0 a 255 au lieu de 0 a 1
tcb = 0.01; %m :taille du carre blanc
I = 1:n;
J = 1:p;
ech = 0; %
s= 0; %intialisation des variables
%-------------------------------------------------------------------------%
% Meme principe que pour la selecton du faisceau sauf qu'ici le test se
% fait sur le vert de ne pas selectionner le laser
for i = I
for j = J
if im(i,j,2)>cbv %selection du vert
image_ech(i,j,2)=im(i,j,2);
end
end
end
%-------------------------------------------------------------------------%
%-------------------------------------------------------------------------%
% Calcul de l'echelle
cpt = 0; %
cpti = 1; %Initialisation des variable
for i = I
for j = J
if image_ech(i,j,2)>0 %Pixel qui n'est pas noir
cpt = cpt + 1; %Compteur augment
else
if and(cpt>0, cpt<10) %test pour eviter les pixels aui ont pu
%rester apres la selction mais qui
%forment une chaine pas assez longue pour
%faire partie du carre
cpt = 0; %remise a zero du compteur
end
end
end
if cpt>0 %test pour savoir si on a eu une tranche du
%carre
s=s + cpt; %somme de tout les cotes pour minimiser les
%incertitudes
cpti = cpti + 1; %nombre de cote +1
cpt=0; %remise du compteur a zero
end
end
ech = (cpti-1)*tcb/s; %regle de trois pour calculer l'echelle
end
%-------------------------------------------------------------------------%
function [ tab_donnees ] = pos_deriv( ech, zx, alpha, z0)
%POS_DERIV float * Mat(int) * float * float-> Mat(float)
% Renvoie une matrice de 5 colonnes aves en premiere colonne la position en
% x (prise tout les dix pixels), la deuxieme contient l'altitude, la
% troisieme la derive spatiale, la quatrieme l'indice et en dernier
% l'incertitude sur l'indice. Elle prend en argument l'echelle, la matrice
% contenant l'altitude en pixel et l'ecart valeur max-min, l'angle
% initiale et l'altitude initiale
neau = 1.33; %on suppose qu'initialement vu que le faisceau est en haut de
%la cuve est donc que la concentration en sucre est faible,
%l'indice optique sera celui de l'eau.
q = size(zx,2); %nombre de colonne de zx
z = zx(1,1);
%-------------------------------------------------------------------------%
%Mise a l'echelle de zx en prenant en compte que la premiere valeur devra
%etre z0
for i = 1:q
zx(1,i) = z0 - ech * (zx(1,i)-z);
zx(2,i) = zx(2,i)*ech;
end
%-------------------------------------------------------------------------%
C0 = neau^2/(sin(alpha)^2+1); %calcul de la constante C0 de la formule
%en tenant compte des valeurs initiales
%-------------------------------------------------------------------------%
%Remplissage du tableau de donnees
j=1;
for i = 1:10:q %10 est le pas afin de ne pas avoir trop de valeur
if i+10<q %test pour eviter le probleme en fin de matrice
tab_donnees(j,1)=(i-1)*ech; %Remplissage des x
tab_donnees(j,2)=zx(1,i); %Remplissage des z
tab_donnees(j,3)=(zx(1,i+10)-zx(1,i))/(10*ech); %derive spatiale
tab_donnees(j,4)=sqrt(C0*(tab_donnees(j,3)^2+1)); %indice
tab_donnees(j,5)=1/2*(zx(2,i)/zx(1,i)); %incertidue de l'indice
j = j+1;
end
end
end
%-------------------------------------------------------------------------%