نمايش پست تنها
قديمي ۰۹-۳۰-۱۳۹۱, ۰۱:۵۰ بعد از ظهر   #11 (لینک دائم)
mahdiii
Active users
 
آواتار mahdiii
 
تاريخ عضويت: اسفند ۱۳۸۸
محل سكونت: مشهد
پست ها: 355
تشكرها: 27
167 تشكر در 131 پست
My Mood: Khoshhal
پيش فرض

خواهش می کنم من نگفتم این کارو برای تک تک تصاویر دستی انجام بدی. تو می تونی از همون بردارهای ویژه استفاده کنی و زاویه رو به دست بیاری. مثلا بردارهای ویژه ات اگه باشن (0.7071,0.7071) , (0.7071,0.7071-) ---> (x,y)
در این صورت tetta=atan2(v(2,2),v(1,2))*180/pi یعنی
tetta=atan2(y,x)*180/pi
که به همین اندازه می چرخونی در جهت منفی
res_image=imrotate(BW2,-tetta);
و بعد اون کارا رو می کنی
اینم کدش
clc
clear all
close all
Image = imread('33.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
%%
[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([-400,400])
ylim([-400,400])
%%
%res_image=imcomplement(dImage);
tetta=atan2(v(2,2),v(1,2))*180/pi;
res_image=imrotate(BW2,-tetta);
[row,col]=size(res_image);
[mxc,indc]=max(sum(res_image,1));
[mxr,indr]=max(sum(res_image,2));
%%-------------------------------------------------------------------------
p1.x=find(res_image(indr,==1,1);
p1.y=indr;
p2.x=col-find(res_image(indr,end:-1:1)==1,1)+1;
p2.y=indr;
p3.y=find(res_image(:,indc)==1,1);
p3.x=indc;
p4.y=row-find(res_image(end:-1:1,indc)==1,1)+1;
p4.x=indc;

figure;imshow(mat2gray((res_image)));
%%-------------------------------------------------------------------------
hold on;plot(p1.x,p1.y,'*','markersize',10);
hold on;plot(p2.x,p2.y,'*','markersize',10);
hold on;plot(p3.x,p3.y,'*','markersize',10);
hold on;plot(p4.x,p4.y,'*','markersize',10);
hold on;plot([p1.x,p2.x],[p1.y,p2.y],'--r');
hold on;plot([p3.x,p4.x],[p3.y,p4.y],'--r');
%%-------------------------------------------------------------------------
mahdiii آفلاين است   پاسخ با نقل قول
از mahdiii تشكر كرده است:
aramis2000 (۱۲-۳-۱۳۹۱)

  #ADS
نشان دهنده تبلیغات
تبليغگر
 
 
 
تاريخ عضويت: -
محل سكونت: -
سن: 2010
پست ها: -
 

نشان دهنده تبلیغات is online