function [LPReg, regions] = associateRegions(reg, img)
if length(reg)>0
regions = cell2struct(reg, {'points'}, 1);
for i = 1:length(regions),
regions(i).posX = mean(regions(i).points.y);
regions(i).posY = mean(regions(i).points.x);
regions(i).area(:,1) = regions(i).points.y;
regions(i).area(:,2) = regions(i).points.x;
regions(i).height = max(regions(i).points.y) - min(regions(i).points.y);
end;
else regions = [];
end;
[Y,I] = sort([regions.posY]);
regions = regions(I);
maxDistCoeff = 3;
maxHeightCoeff = 0.3;
LPReg=[];
tryNext=true;c=0; minMax=1.4;ccc = 1;
for k=1:length(regions),
regions(k).mask=false;
end;
fiTab=[-pi/6:pi/50:pi/6];
for j=1:length(fiTab), % Count convex
if fiTab(j)<0,
lineX = 640;
else
lineX = 0;
end
for n=1:length(regions),
dMin=Inf; dMax=0;
% plot( regions(n).area(:,2), - regions(n).area(:,1), '.'); hold on;
for i=1:length(regions(n).area),
d = distp2l(regions(n).area(i,2), regions(n).area(i,1), lineX, 0, cos(fiTab(j)), -sin(fiTab(j)));
if (d<dMin),
regions(n).convex.iMin(j) = i;
regions(n).convex.dMin(j) = d; dMin=d;
end
if (d>dMax),
regions(n).convex.iMax(j) = i;
regions(n).convex.dMax(j) = d; dMax=d;
end
end
% plot( regions(n).area(regions(n).convex.iMax(j), 2), -regions(n).area(regions(n).convex.iMax(j), 1),'o'); hold on;
% plot( regions(n).area(regions(n).convex.iMin(j), 2), -regions(n).area(regions(n).convex.iMin(j), 1),'ro'); hold on;
end
% hold off
end
while tryNext
%fi = -0.0628;
r=0.5;
maxRDiff = r*6.0;
contribAtMax=[];
[imX imY, depth] = size(img);
m1=0; m2=0; m=0; mxx1 = []; mxx2 = [];
ACC=[];
if sum([regions.mask]==true)<length(regions),
for j=1:length(fiTab),
[acc1, acc2, mx1, mx2, contribAt, regions] = countHough(regions, fiTab, j, r, imX ,imY);
% mxx1=[mxx1, mx1];
% if mx1>m1,
% ac1= acc1;
% [m1, i1] =max(acc1);
% fiMax1 = f;
% contribAtMax(:,1) = contribAt(:,1);
% end
% mxx2=[mxx2, mx2];
% if mx2>m2,
% ac2 = acc2;
% [m2, i2] =max(acc2);
% fiMax2 = f;
% contribAtMax(:,2) = contribAt(:,2);
% end
f = fiTab(j);
mxx1=[mxx1, mx1];
mxx2=[mxx2, mx2];
if max(mx1,mx2)>max(m1,m2),
ac1= acc1;
[m1, i1] =max(acc1);
fiMax1 = f;
contribAtMax(:,1) = contribAt(:,1);
ac2 = acc2;
[m2, i2] =max(acc2);
fiMax2 = f;
contribAtMax(:,2) = contribAt(:,2);
fiIndex = j;
end
%plot(acc1);axis([0 1200 0 2.5])
%ACC=[ACC, acc1'];
end;
end;
%figure
%subplot(2,1,1);
%plot(ac1);hold on; plot(ac2,'r');
%hold off;
%fiMax1*180/pi
%fiMax2*180/pi
%subplot(2,1,2);
%stem(fi*180/pi,mxx1);hold on; stem(fi*180/pi,mxx2,'r');
%hold off;
%pause(0.001)
%end;
%subplot(2,1,1);
%plot(ac1(800:1:1800));hold on; plot(ac2(800:1:1800),'r');
%xlabel('r'); ylabel('a_{\phi}(r)');
%subplot(2,1,2);
%imshow(ACC(1800:-1:800,:)'/max(max(ACC)));
%ylabel('\phi'); xlabel('a_{\phi}(r)');
%hold off;
%figure
skew=[]; fi = -(fiMax1+fiMax2)/2; tryNext=false;cc=1;
c=c+1;
potMask = [];
%if abs(fiMax1-fiMax2)>0.15,
if (max(m1,m2)>minMax),
if (abs(fiMax1-fiMax2)<20*pi/180),
%LPReg(c).regions = [];
for i=1:length(regions),
% plot(regions(i).area(:,2), -regions(i).area(:,1), 'b.'); hold on;
if ~regions(i).mask,
%if (((m1>m2)&&(abs(contribAtMax(i,1)-i1)<=maxRDiff*regions(i).height/10))||((m2>=m1)&&(abs(contribAtMax(i,2)-i2)<=maxRDiff*regions(i).height/10))),
if (((m1>m2)&&(abs(contribAtMax(i,1)-i1)<=maxRDiff*(1+regions(i).height/20)))||((m2>=m1)&&(abs(contribAtMax(i,2)-i2)<=maxRDiff*(1+regions(i).height/20)))),
if cc>1,
dd = dist([LPReg(c).regions(cc-1).posY LPReg(c).regions(cc-1).posX], [regions(i).posY regions(i).posX]');
else
dd=0;
end
if ((cc>1)&&(cc<=3)&&(~((dd<regions(i).height*maxDistCoeff)&&(abs(LPReg(c).regions(cc-1).height-regions(i).height)<maxHeightCoeff*LPReg(c).regions(cc-1).height)))),
cc=1;
for q=1:length(LPReg(c).regions), %Odmaskovani
regions(LPReg(c).numReg(q)).mask=false;
potMask=[potMask, LPReg(c).numReg(q)];
end;
LPReg(c)=[];
end
if ((cc==1)||((dd>0.1*regions(i).height*maxDistCoeff)&&(dd<regions(i).height*maxDistCoeff)&&(abs(LPReg(c).regions(cc-1).height-regions(i).height)<maxHeightCoeff*(LPReg(c).regions(cc-1).height+regions(i).height)/2))),
regions(i).mask=true;
LPReg(c).numReg(cc)=i;
% plot(regions(i).area(:,2), -regions(i).area(:,1), 'r.');
[regions(i).upSkewPoint, regions(i).lowSkewPoint, vv] = findSkew(regions(i), fi);
if ((length(vv)>1)&&(dist(vv,[0 0]'))),
regions(i).skew = angle(vv,[1 0]); regions(i).alpha = fi;
skew = [skew regions(i).skew];
end
LPReg(c).regions(cc) = regions(i);
img = drawLine(img, regions(i).upSkewPoint(1), regions(i).upSkewPoint(2), regions(i).lowSkewPoint(1), regions(i).lowSkewPoint(2),[0 1 0] );
% for k=1:length(regions(i).area),
% img(regions(i).area(k,1),regions(i).area(k,2),:) = [1 1 1];
% end
cc = cc + 1;
end
end
end
end
if ((cc>1)&&(length(LPReg(c).regions)>2)),
%[Y,I] = sort([LPReg(c).regions.posY]);
%LPReg(c).regions = LPReg(c).regions(I);
LPReg(c).skew = findSeqSkew(skew);
lst = length(LPReg(c).regions);
LPReg(c).fiIndex = fiIndex;
LPReg(c).alpha = fi;%angle([(LPReg(c).regions(lst).posY-LPReg(c).regions(1).posY), -(LPReg(c).regions(lst).posX-LPReg(c).regions(1).posX)] ,[1 0]);
LPReg(c).rect = findLPRect(LPReg(c));
%[LPReg(c).img, LPReg(c).mask, LPReg(c).rect] = normLP(LPReg(c), double(origImg), [40 200], mask );
%LPReg(c).img = LPReg(c).img / max( max( LPReg(c).img ) );
%LPReg(c).mask = LPReg(c).mask / max( max( LPReg(c).img ) );
tryNext=true;
else
if length(potMask)>0, %Zamaskovani nejvysiho nepouzitelneho maxima
for q=potMask,
regions(q).mask=true;
end;
tryNext = true;
end;
if (exist('LPReg')&&(length(LPReg)==c)),
LPReg(c) = []; c=c-1;
end;
end
if ((c>0)&&(length(LPReg)==c)),
if ((exist('LPReg'))&&(length(LPReg(c))==1)&&(length(LPReg(c).regions)<3)),
LPReg(c) = [];
end;
end;
end;
end;
end;
if ~exist('LPReg'),
LPReg=-1;
end;
for j=1:length(LPReg), LPReg(j).rcount = length(LPReg(j).regions); end;
%[Y,I] = sort(LPReg.rcount); LPReg = LPReg(I);