
How to find center and radius of an arc from binarized image
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have image of anulus, I need to find center and radius of inner and outer arc 

0 commentaires
Réponses (1)
Mathieu NOE
le 10 Sep 2024
hello
this is what I can offer you today
you will need the attached function (CircleFitByTaubin.m) , and this Fex submission :
results

also you get the info's in the command window if you prefer
----------------------------
Circle # 1:
Re = 659.0384:
xc = 346.9044:
yc = 674.5627:
----------------------------
----------------------------
Circle # 2:
Re = 392.5529:
xc = 339.0362:
yc = 691.2823:
----------------------------
code :
filename = 'image.png';
%% read png file
% inpict = im2double(rgb2gray(imread(filename))); % for RGB pictures
inpict = imread(filename); % for B&W pictures
[m,n] = size(inpict);
% find values above threshold
[y,x] = find(inpict>0.5);
% flip y direction (on the data, not the plot))
y = m-y;
%% some manual work first
% remove left diagonal segment
ind = (x<300);
x(ind) = [];
y(ind) = [];
% remove top horizontal segment
ind = (y>600);
x(ind) = [];
y(ind) = [];
%% separate both curves
% Run DBSCAN Clustering Algorithm
% see Fex : https://fr.mathworks.com/matlabcentral/fileexchange/52905-dbscan-clustering-algorithm
epsilon=100;
MinPts=5;
X = [x y];
IDX=DBSCAN(X,epsilon,MinPts);
%% Plot Results
k=max(IDX);
Colors=hsv(k);
for i=0:k
Xi=X(IDX==i,:);
if i~=0
Style = 'x';
MarkerSize = 8;
Color = Colors(i,:);
else
Style = 'o';
MarkerSize = 6;
Color = [0 0 0];
end
if ~isempty(Xi)
%%
% circle fit here then plot
%%
par = CircleFitByTaubin(Xi);
% Output: Par = [a b R] is the fitting circle:
% center (a,b) and radius R
xc = par(1);
yc = par(2);
Re = par(3);
% display results in command window
disp(['----------------------------']);
disp([' Circle # ' num2str(i) ':']);
disp([' Re = ' num2str(Re) ':']);
disp([' xc = ' num2str(xc) ':']);
disp([' yc = ' num2str(yc) ':']);
disp(['----------------------------']);
% reconstruct circle from data
n=100;
th = (0:n)/n*2*pi;
xe = Re*cos(th)+xc;
ye = Re*sin(th)+yc;
plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color)
hold on
plot(xe,ye,'--','Color',Color)
title(' measured fitted circles')
text(xc-Re*0.5,yc + 0.75*Re,sprintf('center (%g , %g ); R=%g',xc,yc,Re))
axis equal
end
end
hold off;
axis equal;
grid on;
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
2 commentaires
Mathieu NOE
le 2 Oct 2024
my pleasure !
ifmy answer has fullfilled your expectations, do you mind accepting it ?
tx
Voir également
Catégories
En savoir plus sur Statistics and Machine Learning Toolbox dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!