
Odstranění šumu: Je nutné pro správnou funkci hranových detektorů. V našem konkrétním případě lze využít toho, že šum je zásadně tmavšího odstínu než je pozadí a vykytuje se pouze na zkoumaných objektech. Proto lze jednoduchou úpravou získat nezašumělý dvoubarevný obrázek. Při případném výskytu jiného, než takto specifického šumu by bylo nutno šum odfiltrovat například vhodnou 2D konvolucí.
Detekce hran: Použil jsem předdefinované funkce v Matlabu, používající Cannyho hranový detektor.
Nalezení jednotlivých objektů a jejich separace: Konvolucí originálního obrázku s vhodnou konvoluční maskou získáme obrázek(obr.2), kde umístění lokálních maxim bude přibližně odpovídat středům jednotlivých objektů a hodnota tohoto maxima obsahu těchto objektů. V našem případě je obsah jednotlivých objektů natolik rozdílný, že ho můžeme použít přímo k identifikaci a separaci(obr.3). V obecnějším případě bych využil vlastností prvních šesti lokalních maxim Houghovi transformace.
Obr2. Konvoluce originálního obrázku s vhodnou konvoluční maskou

Obr. 3: Jednotlivé separované objekty

Nalezení středů objektů se subpixelovou přesností: Nyní již víme, které objekty jsou kolečka a které čtverce a můžeme použít rozdílné metody k nalezení středů objektů. Pro čtverce pomocí Houghovi transformace získáme analytické vyjádření přímek kryjící se se stranami a pomocí nich i středy čtverců. Pro kruhy použijeme metodu RANSAC a několikanásobně vícekrát než je počet bodů hrany vybereme náhodně trojici bodů a vypočteme rovnici kružnice, kterou jednoznačně určují. Střed pak určíme jako median získaných hodnot. Středy, části přímek a kružnice jsou vykresleny na obr.4.
Obr.4 Středy objektů, části přímek a kružnice

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 |
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