mihaispr
Administrator
 Inregistrat: acum 18 ani
Postari: 2142
|
|
Atasez aici si o varianta realizata in matlab pentru a calcula centrul de masa pentru urmatoarea imagine :
Poza center_of_mass.jpg o plasati in directorul work din matlab:
Codul sursa:
%Script pt.pixeli tetra-conectati -tetra.m
n=4;img=imread('center_of_mass.jpg');imshow(img) BW=im2bw(img);imshow(BW); %BW image binaire, n connectivit? : 4 ou 8 [L, num] = bwlabel(BW, n) %L image labelis?e, num nombre d'objets %initialisation d'un tableau stockant tes centro?des centroid=zeros(num,2); for indice=1:num centroid(indice,1:2)=mean(find(bwlabel==indice)); end
%Script pt.pixeli octo-conectati -octo.m
n=8;img=imread('center_of_mass.jpg');imshow(img) BW=im2bw(img);imshow(BW); %BW image binaire, n connectivit? : 4 ou 8 [L, num] = bwlabel(BW, n) %L image labelis?e, num nombre d'objets %initialisation d'un tableau stockant tes centro?des centroid=zeros(num,2); for indice=1:num centroid(indice,1:2)=mean(find(bwlabel==indice)); end
Pentru rularea celor 2 script-uri este suficient sa rulati in command window:
>>tetra
si
>>octo
Cele 2 tipuri de conectivitati sunt:
a) tetra-conectare
n=4 , 0 1 0 1 P 1 0 1 0
b) octo-conectare n=8 1 1 1 1 P 1 1 1 1
P- reprezinta pixelul central.
Acest script calculeaza centrul de masa pt.fiecare regiune a imaginii.
Scriptul center.m pentru calculul centrului de masa al unei imagini este prezentat mai jos.
Se ia imaginea circuit.tif (care se afla deja in folderul work si se aplica ) asupra ei calculul centrului de masa. Puteti copia o poza cu voi in folder-ul work si sa faceti testul pe ea citind-o in prealabil cu imread.
%Continut script center.m - comentariu matlab
clc;
% preinitializari script matlab (script matlab -nu contine cuvantul rezervat % function deci nu contine o functie sau subfunctie un script matlab) clear all; close all;
global masoara_pete_culoare global k % zona definire variabile globale cu ajutorul cuvantului rezervat global
% totusi nu este recomandabila utilizarea variabilelor globale in matlab % deoarece numele unei variabile poate lua diferite valori alternativ!!!
% titlul aplicatiei disp('Aplicatie pt.a calcula centrul de masa al unei imagini de test citite cu imread'); % i este o imagine cu niveluri multiple de gri (0-255 valori asociate matricei) % j- este o imagine binara (are pixeli albi si negri 0-1)
i=imread('circuit.tif');imshow(i) % citirea imaginii in variabila i j = im2bw(i, 0.4); % pragul pentru imaginea binara stocata in v valoare_prag = 100; %valoare prag j = imfill(j, 'holes');
subplot(3,2,1); imagesc(i); colormap(gray(256)); title('Imaginea initiala');
subplot(3,2,2); imagesc(j); colormap(gray(256)); title('Imagine binara');
label= bwlabel(j, 8); % etichetarea regiunilor din imagine cu functia bwlabel culori_labels= label2rgb (label, 'hsv', 'k', 'shuffle');% culori aleatoare pt.label-uri
subplot(3,2,3); imagesc(label); title('Imaginea cu regiunile etichetata cu ajutorul functiei bwlabel')
subplot(3,2,4); imagesc(culori_labels); title('Culori aleatoare pt.label-uri');
masoara_pete_culoare= regionprops(label, 'all'); %toutes les proprietes des taches d'encre de l'image
numar_pete= size(masoara_pete_culoare, 1);
subplot(3,2,5); imagesc(i); title('Expunere elemente');
hold on; % retinerea graficelor cu subplot
%Functia bwboundaries intoarce un cell-array in care fiecare celula contine %coordonatele linie si coloana pentru fiecare obiect din imagine
frontiere = bwboundaries(j); % j este imagine binara
%functia cell2 mat -convertim din variabila de tip cell-array in variabila %de tip matrice for contor = 1 : numar_pete pata_curenta = cell2mat(bwboundaries(contor)); plot(pata_curenta(:,2), pata_curenta(:,1), 'g','LineWidth', 2); end
%undefined index matrix error conversie cell2mat solutie
hold off; % operatie opusa lui hold on
for k = 1 : numar_pete listare_pixeli = masoara_pete_culoare(k).PixelIdxList; % listare pixeli cu ajutorul PixelIdxList
hold off; % operatie medie pt.fiecare pata de culoare cu ajutorul functiei mean
medie = mean(i(listare_pixeli)); % intensitate medie in imaginea i
suprafata_pata = masoara_pete_culoare(k).Area; % arie perimetru_pata = masoara_pete_culoare(k).Perimeter; % perimetru centru_de_masa = masoara_pete_culoare(k).Centroid; % centroid -centre de masse
%afisare date cu fprintf
fprintf(1,'#%d %18.1f %11.1f %8.1f %8.1f \n', k, medie,suprafata_pata , perimetru_pata, centru_de_masa ); % afisare folosind functia fprintf end
|
|