Least Square Method for circle fitting

13 views (last 30 days)
Rishika Agarwal
Rishika Agarwal on 3 Oct 2020
Edited: Harsh Parikh on 6 Oct 2020
Hi, I am looking for a code that can help me guess how close the borders/edge of a image is to a circle using least sqaure method.
I = imread('i.jpg');
imshow(I)
BW = imbinarize(I(:,:,1),0.5);
% imshow(BW)
[B, L] = bwboundaries(BW,'noholes');
imshow(label2rgb(L))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end
using the above code, i am able to get a edge but now i have to plot these edge points and fit circle if possible to see its resemblence to the actuall circle, i am very new t matlab and is badly in need of help
thanks

Answers (2)

Priysha LNU
Priysha LNU on 6 Oct 2020
To find the smallest distance between a circle and an edge, given that you have already got the edge of the image, you may calculate the perpendicular distance between the center of the circle and the edge. Let this distance be 'a'.
The ability to automatically calculate the shortest distance from a point to a line is not available in MATLAB. To work around this, see the following function:
function d = point_to_line(pt, v1, v2)
a = v1 - v2;
b = pt - v2;
d = norm(cross(a,b)) / norm(a);
In this function, pt, v1, and v2 are the three-dimensional coordinates of the point, one vertex on the line, and a second vertex on the line, respectively. The following example illustrates how this function would be called:
v1 = [0,0,0];
v2 = [3,0,0];
pt = [0,5,0];
a = point_to_line(pt,v1,v2)
You may then subtract the radius of the circle 'r' from 'a' to get the shortest distance between the circumfrence of the circle and edge of the image.
DISCLAIMER: These are my own views and in no way depict those of MathWorks.

Harsh Parikh
Harsh Parikh on 6 Oct 2020
Edited: Harsh Parikh on 6 Oct 2020
Hi,
'bwboundaries()' returns a set of 'Edges' it finds in the input image. Given that, you can use the following piece of code to fit the points as least squares method.
I have used the following image (circle.png) for the testing purpose.
I = imread('circle.png');
imshow(I)
BW = imbinarize(I(:,:,1),0.5);
[B, L] = bwboundaries(BW,'noholes');
fgg = B{2}; % B has two edges: 1. Square 2. Circle from the image, you might need to do the below for the
x = fgg(:,1);
y = fgg(:,2);
ang = linspace(0,2*pi,length(fgg))'; % angles
plot(x,y,'+') % Plot the actual points
axis equal; hold on;
c = [x y ones(length(x),1)]\-(x.^2+y.^2); %least squares fit
xhat = -c(1)/2;
yhat = -c(2)/2;
rhat = sqrt(xhat^2+yhat^2-c(3));
plot(rhat*cos(ang)+xhat,rhat*sin(ang)+yhat,...
'g','linewidth',2) %plot the best fit circle from it's parameters
Both the plots would overlap in the case of Circular object or you can see how closely the points resemble to a circle.
Use the following ('ellipse.png') to check the same:
You might want to check out the following links which deals with the similar problem with different approaches:
Hope this helps.

Categories

Find more on Visual Exploration in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!