Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
wiki:projet:trait_image [2017/03/16 14:15] http_fablab.sorbonne-universites.fr_wiki_doku.php_id_wiki_projet_laser |
wiki:projet:trait_image [2017/04/24 09:54] (Version actuelle) http_fablab.sorbonne-universites.fr_wiki_doku.php_id_wiki_projet_laser [COMMENTAIRES] |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
===== CODES MATLAB ===== | ===== CODES MATLAB ===== | ||
- | ==== SELECTION DU FAISCEAU ==== | + | ==== TRAITEMENT ==== |
+ | |||
+ | < | ||
+ | |||
+ | close all | ||
+ | %-------------------------------------------------------------------------% | ||
+ | % | ||
+ | % % | ||
+ | % Ce premier fichier est le pogramme de traitement. Il lit une image, | ||
+ | % puis appelle differentes fonctions afin de la traiter. | ||
+ | clear figure | ||
+ | Im = imread(' | ||
+ | %contiennent les intensites de rouge, vert | ||
+ | %pour chaque pixel de l' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | imf = faisceau(Im, | ||
+ | %dans imf (plus d' | ||
+ | %faisceau.m) | ||
+ | |||
+ | figure %nouvelle fenetre pour une figure | ||
+ | image(imf) %affichage de l' | ||
+ | |||
+ | [imf2, zx] = affinage(imf); | ||
+ | %image et zx une matrice 2xp, p etant la | ||
+ | %largeur de l' | ||
+ | %fichier affinage.m) | ||
+ | |||
+ | |||
+ | figure %nouvelle fenetre pour une figure | ||
+ | image(imf2) %affichage de l' | ||
+ | |||
+ | ime = imread(' | ||
+ | [imech, ech] = echelle(ime); | ||
+ | %image et ech un flottant (plus d' | ||
+ | %dans le fichier affinage.m) | ||
+ | |||
+ | figure %nouvelle fenetre pour une figure | ||
+ | image(imech) %affichage de l' | ||
+ | |||
+ | res = pos_deriv(ech, | ||
+ | %est une matrice nx5 (plus d' | ||
+ | %dans le fichier affinage.m) | ||
+ | |||
+ | figure | ||
+ | plot(res(:, | ||
+ | |||
+ | title(' | ||
+ | xlabel(' | ||
+ | ylabel(' | ||
+ | |||
+ | |||
+ | figure | ||
+ | plot(res(:, | ||
+ | title(' | ||
+ | xlabel(' | ||
+ | ylabel(' | ||
+ | %errorbar(res(:, | ||
+ | |||
+ | % figure | ||
+ | % ft = fit(res(:, | ||
+ | % plot(ft) | ||
+ | % save(' | ||
+ | save(' | ||
+ | %fichier .txt | ||
+ | |||
+ | |||
+ | %-------------------------------------------------------------------------% | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== FAISCEAU ==== | ||
< | < | ||
function [ image_fais ] = faisceau( im, min ) | function [ image_fais ] = faisceau( im, min ) | ||
- | %FAISCEAU Mat(int*int*int) * Mat(int) -> Mat(int*int*int) | + | %FAISCEAU Mat(3*Mat(int)) * Mat(int) -> Mat(3*Mat(int)) |
% | % | ||
- | % laser grace a la coueur rouge | + | % laser grace a la coueur rouge et prend en argument l' |
+ | % le pixel minimal | ||
- | n= size(im, | + | n= size(im,1); %nombre de ligne |
- | p= size(im,2) | + | p= size(im,2); %nombre de colonne |
im = uint8(im); %convertit l' | im = uint8(im); %convertit l' | ||
- | %varie de 0 a 255 au lieu de 0 a 1 | + | |
+ | | ||
image_fais= zeros(n, | image_fais= zeros(n, | ||
- | image_fais = uint8(image_fais); | + | image_fais = uint8(image_fais); |
+ | %varie de 0 a 255 au lieu de 0 a 1 | ||
- | I = 1:n; | + | I = 1:n; |
J = 1:p; | J = 1:p; | ||
for i = I | for i = I | ||
+ | | ||
for j = J | for j = J | ||
+ | | ||
if im(i, | if im(i, | ||
- | image_fais(i, | + | image_fais(i, |
- | | + | |
+ | |||
end | end | ||
| | ||
+ | end | ||
end | end | ||
+ | |||
+ | %-------------------------------------------------------------------------% | ||
</ | </ | ||
- | ==== TRAITEMENT DE L' | + | ==== AFFINAGE |
< | < | ||
- | Im = imread('exp_glo.jpg'); | + | 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' | ||
+ | n= size(im,1); %nombre de ligne | ||
+ | p= size(im,2); %nombre de colonne | ||
+ | im = uint8(im); %convertit l' | ||
+ | %varie de 0 a 255 au lieu de 0 a 1 | ||
+ | | ||
+ | xm=zeros(2, | ||
- | mint = [135 29 69] | + | I = 1:n; |
+ | J = 1:p; | ||
- | imf = faisceau(Im, | + | %-------------------------------------------------------------------------% |
+ | %Remplissage du tableau xm | ||
- | image(Im) | + | 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; | ||
+ | |||
+ | s=s+1; | ||
+ | |||
+ | end | ||
+ | |||
+ | end | ||
+ | |||
+ | ecart = abs(xmin-xmax)/ | ||
+ | |||
+ | xm(1, | ||
+ | xm(2, | ||
- | figure | + | end |
- | image(imf) | + | |
- | figure | + | %-------------------------------------------------------------------------% |
- | [imf2, zx] = affinage(imf); | + | |
- | image(imf2) | + | |
- | figure | + | imf = zeros(n, |
- | plot(0:size(zx, | + | %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, | ||
+ | xm(1,p+1-j)=NaN; %La valeur NaN permet de faire en sorte que la | ||
+ | | ||
+ | | ||
+ | |||
+ | else | ||
+ | test = xm(1, | ||
+ | end | ||
+ | |||
+ | end | ||
+ | %-------------------------------------------------------------------------% | ||
+ | |||
+ | imf = uint8(imf); %convertit l' | ||
+ | %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)> | ||
+ | imf(xm(1, | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | |||
+ | %-------------------------------------------------------------------------% | ||
</ | </ | ||
- | ==== AFFINAGE | + | ==== ECHELLE |
< | < | ||
- | function [ imf, xm ] = affinage( im ) | + | function [ image_ech, ech] = echelle( im ) |
- | %AFFINAGE | + | %ECHELLE |
- | % Retourne l'image en moyennant les positions verticales des pixels rouges | + | % Renvoie une image avec seulement le carre temoin |
- | %pour avoir un trait fin et le tableau contenant ces valeurs | + | % l' |
- | n= size(im,1); | + | im = uint8(im); %convertit l' |
- | p= size(im,2); | + | |
- | im = uint8(im); | + | |
- | xm=zeros(1,p); | + | 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_ech = uint8(image_ech); | ||
+ | %varie de 0 a 255 au lieu de 0 a 1 | ||
+ | |||
+ | tcb = 0.01; %m :taille du carre blanc | ||
I = 1:n; | I = 1:n; | ||
J = 1:p; | J = 1:p; | ||
- | for j = J | + | ech = 0; |
- | s=0; | + | s= 0; %intialisation des variables |
- | x=0; | + | |
- | for i = I | + | %-------------------------------------------------------------------------% |
- | if im(i, | + | % 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, | ||
+ | | ||
+ | end | ||
| | ||
- | x = x+i; | + | end |
- | | + | %-------------------------------------------------------------------------% |
+ | |||
+ | %-------------------------------------------------------------------------% | ||
+ | % Calcul de l' | ||
+ | |||
+ | cpt = 0; % | ||
+ | cpti = 1; | ||
+ | |||
+ | for i = I | ||
+ | for j = J | ||
+ | if image_ech(i, | ||
+ | | ||
+ | else | ||
+ | if and(cpt> | ||
+ | %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 | ||
- | xm(j)=floor(x/ | + | |
end | end | ||
+ | if cpt> | ||
+ | %carre | ||
+ | s=s + cpt; %somme de tout les cotes pour minimiser les | ||
+ | %incertitudes | ||
+ | cpti = cpti + 1; %nombre de cote +1 | ||
+ | cpt=0; | ||
+ | end | ||
+ | |||
end | end | ||
- | imf = zeros(n, | ||
- | % | + | ech = (cpti-1)*tcb/s; %regle de trois pour calculer l' |
- | x=xm(p-1); | + | end |
- | xm(p)=x; | + | %-------------------------------------------------------------------------% |
- | test = xm(p); | + | |
- | for j=2:p | + | </ |
- | if abs(xm(p+1-j)-test)>8 | + | |
- | xm(p+1-j)=NaN; | + | |
- | else | + | ==== POS_DERIV ==== |
- | | + | |
- | | + | < |
+ | |||
+ | 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' | ||
+ | % troisieme la derive spatiale, la quatrieme l' | ||
+ | % l' | ||
+ | % contenant l' | ||
+ | % initiale et l' | ||
+ | |||
+ | neau = 1.33; %on suppose qu' | ||
+ | %la cuve est donc que la concentration en sucre est faible, | ||
+ | %l' | ||
+ | |||
+ | q = size(zx,2); %nombre de colonne de zx | ||
+ | |||
+ | z = zx(1,1); | ||
+ | |||
+ | %-------------------------------------------------------------------------% | ||
+ | %Mise a l' | ||
+ | %etre z0 | ||
+ | |||
+ | for i = 1:q | ||
+ | zx(1,i) = z0 - ech * (zx(1,i)-z); | ||
+ | | ||
end | end | ||
- | % entre les deux signes : Elimination des valeurs tres aberantes | ||
- | imf = uint8(imf); | + | |
- | for j = J | + | %-------------------------------------------------------------------------% |
- | if xm(j)>0 | + | |
- | | + | C0 = neau^2/(sin(alpha)^2+1); |
+ | %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,3)=devfite((i-1)*ech); | ||
+ | %Ce fit a ete obtenu a l'aide des donnees contenu dans zx. | ||
+ | %La ligne pour l' | ||
+ | tab_donnees(j,4)=sqrt(C0*(devfite((i-1)*ech)^2+1)); | ||
+ | %tab_donnees(j, | ||
+ | j = j+1; | ||
end | end | ||
end | end | ||
+ | |||
+ | end | ||
+ | %-------------------------------------------------------------------------% | ||
</ | </ | ||
+ | |||
+ | |||
+ | ===== GRAPHES ===== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | ===== COMMENTAIRES ===== | ||
+ | |||
+ | <WRAP center round box 100%> | ||
+ | |||
+ | La première figure représente l’image de départ, soit le faisceau laser dans la cuve.\\ | ||
+ | La deuxième est l’image que sort la fonction faisceau, le faisceau est sélectionné grâce à son intensité de rouge, puis on place les pixels valides sur une image initialement noire.\\ | ||
+ | La troisième est l' | ||
+ | La quatrième figure est un graphe représentant l' | ||
+ | Enfin la dernière image est le graphe de l’indice en fonction de l' | ||
+ | |||
+ | Lors de l' | ||
+ | |||
+ | </ |