I want to misure the distance of the centroids in the middle of the arrays.

조회 수: 4 (최근 30일)
Andrea Rapagnani
Andrea Rapagnani 2019년 6월 26일
편집: Andrea Rapagnani 2019년 6월 26일
My problem is that .if i make some photo without changing anything (images titled IMG_20190612_171824.jpg, IMG_20190612_171827.jpg , IMG_20190612_171831.jpg, IMG_20190612_171833.jpg ) the result of the distances are different instead they should be the same. Moreover if i shift the arrays of 1 mm by 1 mm for 4 times (images titled 1 to 4) the rusults are wrong.
I think the error is caused by the perspective between the two arrays when i make the photos.
These are my results
Images distanzamm distanzammV
1 70,2571 70,2503
2 70,5235 70,5148
3 71,9935 71,9824
4 73,0709 73,0636
IMG_20190612_171824 65,2592 65,2469
IMG_20190612_171827 65,0417 65,0311
IMG_20190612_171831 65,4204 65,4092
IMG_20190612_171833 65,1371 65,1225
This is my program:
clc %pulisce la command window
clear %rimuove tutte le variabili
close all %chiude file dopo la scrittura di dati video
%lettura immagine
IMG=imread('image.jpg'); %carica l'immagine
%filtraggio immagine
level=graythresh(IMG); %calcola la soglia da utilizzare in im2bw
bw=im2bw(IMG,level); %trasforma l'immagine in bianco e nero
bw=~bw; %bw non è uguale a bw (mantengo lo stesso nome variabile ma continuo a modificare)
figure; %crea una nuova finestra di figura
imshow(bw); %mostra l'immagine bw
bw=bwareaopen(bw,1200); %rimuove tutti i corpi con meno di 1200 pixel
bw=imclearborder(bw); %sopprime le strutture luminose collegate al bordo dell'immagine
A = roipoly(bw); %seleziona la zona di interesse (comando interattivo)
bw(A)=0; %i valori selezionati in "A" li trasformo in 0(cioè nero)
%centroidi
s=regionprops(bw,'centroid'); %trova i centroidi dell'immagine IMG e li inserisce in una matice s di struttura(struct)
centroids=cat(1,s.Centroid); %memorizza le coordinate (x;y) dei centroidi in una matrice di due colonne
figure; %crea una nuova finestra di figura
imshow(bw); %mostra l'immagine bw
hold on; %mantiene l'immagine
plot(centroids(:,1),centroids(:,2),'r*'); %disegna i centrodi sull'immagine
%trasformazione prospettica
[xi yi]=getpts; %trova ascisse(xi) e ordinate(yi) dei punti selezionati(i 4 vertici del rettangolo superiore)
for n=1:4 %PER "n" variabile da 1 a 4 [1;2;3;4] (4 sono i punti da noi selezionati)
dist=sqrt(sum(((centroids-repmat([xi(n) yi(n)],69,1)).^2)')); %trova tutte le distanze dei centroidi da ognuno dei 4 punti selezionati
[~,v(n)]=min(dist); %trova il centroide meno distante da ognuno dei punti selezionati
end
vertici=centroids(v,:); %crea una matrice con le coordinate dei vertici v
plot(vertici(:,1),vertici(:,2),'og'); %cerchia i vertici sull'immagine
LX=((vertici(1,1)-vertici(3,1))^2+(vertici(1,2)-vertici(3,2))^2)^0.5;
LY=((vertici(1,1)-vertici(2,1))^2+(vertici(1,2)-vertici(2,2))^2)^0.5;
r=LX/LY;
U=vertici; %U è uguale alla matrice vertici
X=[0 0;0 500;500*r 0;500*r 500]; %X è la matrice con le coordinate dei vertici spostate
tform=fitgeotrans(U,X,'projective'); %definisce la trasformazione geometrica (prospettica)
WARP=imwarp(bw,tform); %applica la trasformazione geometrica definita con tform su bw
%ritaglio superiore
figure %crea una nuova finestra di figura
imshow(WARP); %mostra l'immagine WARP
s=regionprops(WARP,'centroid');
centroids=cat(1,s.Centroid);
centroids=sortrows(centroids,2);
centroidsT=centroids(1:60,:);
centroidsB=centroids(61:69,:);
CT=mean(centroidsT);
CB=mean(centroidsB);
hold on; %mantiene l'immagine
plot(centroidsT(:,1),centroidsT(:,2),'*r');
plot(centroidsB(:,1),centroidsB(:,2),'*g');
plot(CT(:,1),CT(:,2),'or');
plot(CB(:,1),CB(:,2),'og');
distanzapixel=sqrt((CT(:,1)-CB(:,1))^2+(CT(:,2)-CB(:,2))^2);
distanzapixelV=sqrt((CT(:,2)-CB(:,2))^2);
plot([CT(:,1) CB(:,1)],[CT(:,2) CB(:,2)],'g');
plot([CT(:,1) CT(:,1)],[CT(:,2) CB(:,2)],'r');
for r=1:5
centroidsT((r-1)*12+1:r*12,:)=sortrows(centroidsT((r-1)*12+1:r*12,:),1);
end
n=1;
clear dist
for r=1:5
for c=1:11
dist(n,1)=((centroidsT((r-1)*12+1+c-1,1)-centroidsT((r-1)*12+1+c,1))^2+(centroidsT((r-1)*12+1+c-1,2)-centroidsT((r-1)*12+1+c,2))^2)^0.5;
n=n+1;
end
end
for c=1:12
for r=1:4
dist(n,1)=((centroidsT((r-1)*12+1+c-1,1)-centroidsT(r*12+1+c-1,1))^2+(centroidsT((r-1)*12+1+c-1,2)-centroidsT(r*12+1+c-1,2))^2)^0.5;
n=n+1;
end
end
for r=1:3
centroidsB((r-1)*3+1:r*3,:)=sortrows(centroidsB((r-1)*3+1:r*3,:),1);
end
n=1;
for r=1:3
for c=1:2
distB(n,1)=((centroidsB((r-1)*3+1+c-1,1)-centroidsB((r-1)*3+1+c,1))^2+(centroidsB((r-1)*3+1+c-1,2)-centroidsB((r-1)*3+1+c,2))^2)^0.5;
n=n+1;
end
end
for c=1:3
for r=1:2
distB(n,1)=((centroidsB((r-1)*3+1+c-1,1)-centroidsB(r*3+1+c-1,1))^2+(centroidsB((r-1)*3+1+c-1,2)-centroidsB(r*3+1+c-1,2))^2)^0.5;
n=n+1;
end
end
ps=5/mean([mean(dist) mean(distB)]); % pixel scale mm/pixel
distanzamm=ps*distanzapixel;
distanzammV=ps*distanzapixelV;
risultati=[distanzamm distanzammV];

답변 (0개)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by