من یکم تغییر دادم. لازم نیست پیرامون رو به دست بیاری. با همون تصویر دودویی شده (که پیکسلهای داخلی رو هم شامل میشه) نتیجه بهتره. برای تست می تونی تصویرو بچرخونی و کدو اجرا کنی دوباره
clc
clear all
close all
Image = imread('image.jpg');
if(ndims(Image==3))
Image=rgb2gray(Image);
end
Image=imresize(Image,0.25);
dImage = im2double(Image);
logicalImage = im2bw(dImage, 0.9);
BW=imcomplement(logicalImage);
BW2 = bwareaopen(BW,30);
%BW2 = bwmorph(BW,'remove'); % get the contour
%% Rotation
%BW2=imrotate(BW2,30);
%%
[rr cc]=find(BW2==1);
Y=-rr;
X=cc;
xc=mean(X);
yc=mean(Y);
xx=X-xc;
yy=Y-yc;
co=cov([xx yy]);
[v d]=eig(co);
length_diam1=2*sqrt(d(1,1))*v(:,1); % the length of diameter
length_diam2=2*sqrt(d(2,2))*v(:,2); % the length of diameter
figure;
plot(xx,yy,'.b');
hold on;plot([0,length_diam1(1)],[0,length_diam1(2)],'r');
hold on;plot([0,length_diam2(1)],[0,length_diam2(2)],'r');
xlim([-100,100])
ylim([-100,100])
|