Least Square Method for circle fitting
조회 수: 10 (최근 30일)
이전 댓글 표시
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
댓글 수: 0
답변 (2개)
Priysha LNU
2020년 10월 6일
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.
댓글 수: 0
Harsh Parikh
2020년 10월 6일
편집: Harsh Parikh
2020년 10월 6일
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:
- https://www.mathworks.com/help/images/identifying-round-objects.html
- https://www.mathworks.com/help/images/detect-and-measure-circular-objects-in-an-image.html
- https://www.mathworks.com/help/images/measuring-the-radius-of-a-roll-of-tape.html
Hope this helps.
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Mathematics and Optimization에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!