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

2 views (last 30 days)
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];

Answers (0)

Categories

Find more on Image Processing Toolbox in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!