Popis a klasifikace objektů      

 

    Vstup:

     

 

Popis řešení:

      Obr2. Konvoluce originálního obrázku s vhodnou konvoluční maskou

      

 

      Obr. 3: Jednotlivé separované objekty  

     

 

      Obr.4 Středy objektů, části přímek a kružnice

     

 

 

Výstup:

Středy čtverců:

1 2 3
x0

358.7811

  182.2065   373.8103
y0 472.8348  384.6394   245.1531

 

Středy kruhů:

1 2 3 4
x0

  43.7024

  357.7500 87.6995 269.6720
y0   258.2857  74.4553 129.9178 541.5484

 

Zdrojový kód:

im=double(imread('zapocet2.tif'));

im2=im;

%%%%%%%%%%%%%%% Odstraneni sumu %%%%%%%%%%%%%%%

im2(find(im<240))=1;

im2(find(im>239))=0;

 

%%%%%%%%%%%%%%% Detekce hran %%%%%%%%%%%%%%%%%

edgeim = edge (im2, 'canny');

figure(4)

hold off;

imshow(edgeim,[])

 

%%%%%%%%%%%%%%%%%%% nalezeni jednotlivych objektu pomoci konvoluce %%%%%%%%%%%%%%%%%%%%%%%55

siz=size(im);

h = FSPECIAL('gaussian',[siz(1),siz(2)],20);

ffth=fft2(h);

fftim=fft2(im2);

sol=ffth.*fftim;

figure(20);

c=abs(ifft2(sol));

imshow(c,[])

figure(1);

hold off;

imshow(im,[]);

dist=50;

n=16;

[maxima,maxi]=findmaxi(c,n,dist);

figure(1);

hold off;

imshow(edgeim,[]);

m=maxima;

m(:,2)=m(:,2)-260;

m(:,1)=m(:,1)-290;

u=find(m(:,2)<1);

m(u,2)=m(u,2)+520;

u=find(m(:,1)<1);

m(u,1)=m(u,1)+580;

hold on;

plot(m(:,2),m(:,1),'r*')

mx=m(:,2);

my=m(:,1);

%%%%%%%%%%%%%%%%rozdeleni na jednotlive objekty %%%%%%%%%%%%%%%%%%%%%%%%5

dis=50;

n=16;

obj=zeros(2*dis+1,2*dis+1,n);

figure(10);

myl=my-dis;

myh=my+dis;

mxl=mx-dis;

mxh=mx+dis;

myl(find(myl<1))=1;

mxl(find(mxl<1))=1;

myh(find(myh>siz(1)))=siz(1);

mxh(find(mxh>siz(2)))=siz(2);

dy=myh-myl+1;

dx=mxh-mxl+1;

for i=1:n,

 

obj(1:dy(i),1:dx(i),i)=edgeim(myl(i):myh(i),mxl(i):mxh(i));

subplot(1,n,i);

imshow(obj(:,:,i))

end;

 

 

rect=find(maxi>0.75); %%%%%%%%%%%% empiricky urceno na ctverce, vychazi z velikosti konvoluce

circ=find(maxi<0.75 & maxi>0.695); %%%%%%%%%%%% empiricky urceno na kruhy, vychazi z velikosti konvoluce

 

%%%%%%%%%%%%%%%% Hledani stredu ctvercu %%%%%%%%%%%%%%%

q=[];

k=[];

x0=[];

y0=[];

figure(4);

hold on;

for i=1:length(rect),

r(:,:)=obj(:,:,rect(i));

theta=0:0.33:179;

[rad,xp]=radon(r,theta);

p=findmaxima(rad,4,20);

 

[imr,imc] = size(r);

cr = floor( (imr+1)/2 );

cc = floor( (imc+1)/2 );

 

for j=1:4,

xpmax = xp(p(j,1));

fi = (pi/180)*(theta(p(j,2)));

x= [-(cc-1):cc];

 

y= -(xpmax - x*cos(fi))/sin(fi);

q(i,j)=-xpmax/sin(fi);

k(i,j)=(cos(fi)/sin(fi));

 

plot(x+cc+mxl(rect(i))-1,y+cr+myl(rect(i))-1,'b-'%%%%%%%%%% vykresleni primek %%%%%%%%%%%

end;

[a,b]=sort(k(i,:));

ck(i,1)=mean(a(1:2));

ck(i,2)=mean(a(3:4));

cq(i,1)=(q(i,b(1))+q(i,b(2)))/2;

cq(i,2)=(q(i,b(3))+q(i,b(4)))/2;

y1=ck(i,1)*x+cq(i,1);

y2=ck(i,2)*x+cq(i,2);

x0(i)=(cq(i,2)-cq(i,1))/(ck(i,1)-ck(i,2));

y0(i)=x0(i)*ck(i,1)+cq(i,1);

xx0(i)=x0(i)+cc-1+mxl(rect(i));

yy0(i)=y0(i)+cr-1+myl(rect(i));

 

end;

plot(xx0,yy0,'r*')

maxi=i;

 

 

%%%%%%%%%%%%%%% Hledani stredu kruznic %%%%%%%%%%%%%%%%%%%%

c=[];center=[];cen=[];

for i=1:length(circ),

c(:,:)=obj(:,:,circ(i));

[xx,yy]=ind2sub(size(c),find(c));

l=length(xx);

for j=1:5*l,

m=round((l-1)*rand)+1;

n=round((l-1)*rand)+1;

o=round((l-1)*rand)+1;

cen(j,:)=center_of_circle(xx(m),yy(m),xx(n),yy(n),xx(o),yy(o));

end;

center(i,1)=(median(cen(find(cen(:,1)>0),1)));

center(i,2)=(median(cen(find(cen(:,2)>0),2)));

r=(median(cen(find(cen(:,3)>0),3)));

figure(15+i);

hold off;

imshow(c,[]);

hold on;

plot(center(i,2),center(i,1),'r*')

xx0(i+maxi)=center(i,2)-1+mxl(circ(i));

yy0(i+maxi)=center(i,1)-1+myl(circ(i));

figure(4)

circle(xx0(i+maxi),yy0(i+maxi),r);  %%%%%%%%vykresleni kruznic %%%%%%%%%%%%%%%%%%%

end;

 

figure(4);

plot(xx0,yy0,'r*') %%%%%%%%%% vykresleni stredu %%%%%%%%%%

 Vypracoval: Martin Komárek