%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This is an implementation of CONFIGR, % as described in CAS/CNS Technical Report TR-2007-016 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Programmed by Chaitanya Sai (August 2007) %%%%%%%%%%%%%%%%%%%%%%%%% % % The notation follows the article's notation, % as does the headers for each step of the % algorithm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Finds boundaries in input image for i=1:4 Icrawl{i}=zeros(ImSize); end KernVert=[-1 .2 1]; KernHoriz=[-1 .2 1]'; Icrawl{1}=sparse(double(abs(conv2(I,KernHoriz,'same')-.2)==1)); Icrawl{2}=sparse(double(abs(conv2(I,KernVert,'same')-.2)==1)); Icrawl{3}=sparse(double(abs(conv2(I,KernHoriz,'same')-.2)==1)); Icrawl{4}=sparse(double(abs(conv2(I,KernVert,'same')-.2)==1)); Icrawl{9}=sparse(double(sign02(Icrawl{1}+Icrawl{2}+Icrawl{3}+Icrawl{4}-2))); Inonsides=1+Icrawl{9}-I; % Any non zero fractional value can be used instead of the .2 KernVertA=[-1 .2 1;-1 .2 1;-1 .2 1]; KernVertB=[1 .2 -1;1 .2 -1;1 .2 -1]; KernHorizA=KernVertA'; KernHorizB=KernVertB'; KernCorn{1}=[-1 1 0]; KernCorn{2}=[0 1 -1]'; KernCorn{3}=[0 1 -1]; KernCorn{4}=[-1 1 0]'; Icrawl{1}=sparse(double(conv2(I,KernHorizA,'same')>2.5).*I+double(conv2(I,KernHorizB,'same')>2.5).*I); Icrawl{2}=sparse(double(conv2(I,KernVertA,'same')>2.5).*I+double(conv2(I,KernVertB,'same')>2.5).*I); Icrawl{3}=Icrawl{1}; Icrawl{4}=Icrawl{2}; % Icrawl{1}--0 degrees,Icrawl{2}--90,Icrawl{1}--180 degrees,Icrawl{1}--270 degrees Icrawl{9}=sparse(double(sign02(Icrawl{1}+Icrawl{2}+Icrawl{3}+Icrawl{4}-2))); Iedges=sign02(Icrawl{1}+Icrawl{2}+Icrawl{3}+Icrawl{4}); Iedges=I-imerode(I,[1 1 1;1 1 1;1 1 1]); % These matrices store ones in the locations of the corners in the input % image Icrawl{5}=sparse(sign02(Icrawl{1}+Icrawl{2}-1.1)*(complex(1,1))); Icrawl{6}=sparse(sign02(Icrawl{2}+Icrawl{3}-1.1)*(complex(-1,1))); Icrawl{7}=sparse(sign02(Icrawl{3}+Icrawl{4}-1.1)*(complex(-1,-1))); Icrawl{8}=sparse(sign02(Icrawl{4}+Icrawl{1}-1.1)*(complex(1,-1))); % Inonsides stores one in the locations where there are no non-convex-corner sub-pixels. %The non-convex specificity is a fortuitous outcome of the method used in computing boundary pixels for i=1:4; Icrawl{i}=Icrawl{i}-Icrawl{9}.*sign02(conv2(full(Icrawl{i}),KernCorn{i},'same')); end %Bipole Lobe Size LobSiz=SubPixRes*2+1; LobeTemp1=zeros(LobSiz); LobeTemp1(ceil(LobSiz/2),ceil(LobSiz/2)-1:ceil(LobSiz/2))=1; IcrawlT{1}=sparse(Icrawl{1}.*(1+Iedges-I)); IcrawlT{2}=sparse(Icrawl{2}.*(1+Iedges-I)); IcrawlT{3}=sparse(Icrawl{3}.*(1+Iedges-I)); IcrawlT{4}=sparse(Icrawl{4}.*(1+Iedges-I)); IcrawlT{5}=sparse(zeros(size(IcrawlT{1}))); IcrawlT{6}=sparse(IcrawlT{5}); IcrawlT{7}=sparse(IcrawlT{5}); IcrawlT{8}=sparse(IcrawlT{5}); IcrawlT_old=IcrawlT; IcrawlTPura{5}=sparse(zeros(size(IcrawlT{1}))); IcrawlTPura{6}=sparse(IcrawlT{5}); IcrawlTPura{7}=sparse(IcrawlT{5}); IcrawlTPura{8}=sparse(IcrawlT{5}); IcrawlTPura_temp{5}=sparse(zeros(size(IcrawlT{1}))); IcrawlTPura_temp{6}=sparse(IcrawlT{5}); IcrawlTPura_temp{7}=sparse(IcrawlT{5}); IcrawlTPura_temp{8}=sparse(IcrawlT{5});