1 | %BLURDM Blurred Euclidean distance between blobs |
---|
2 | % |
---|
3 | % D = BLURDISTM(A,B,RA,RB) |
---|
4 | % |
---|
5 | % INPUT |
---|
6 | % A MYA x MXA x NA matrix of NA binary images of the size MYA x MXA |
---|
7 | % B MYB x MXB x NB matrix of NA binary images of the size MYB x MXB |
---|
8 | % RA,RB Blurring paramters (optional, default: 1, no blurring) |
---|
9 | % |
---|
10 | % OUTPUT |
---|
11 | % D NA x NB Blurred Euclidean distance matrix |
---|
12 | % |
---|
13 | % DESCRIPTION |
---|
14 | % Computes the blurred Euclidean distance matrix D between sets of blobs. |
---|
15 | % Images are first uniformly blurred with the sizes of RA x RA or RB x RB. |
---|
16 | % Next they are rescaled to square images with the sizes equal to |
---|
17 | % max([MYA,MXA,MYB,MXB]) vy using bilinear interpolation. Finally, the |
---|
18 | % Euclidean distance is computed. |
---|
19 | % |
---|
20 | % Preferably use NA <= NB, as it is faster. |
---|
21 | |
---|
22 | % Copyright: R.P.W. Duin, r.duin@ieee.org |
---|
23 | % Ela Pekalska, ela.pekalska@googlemail.com |
---|
24 | % Faculty EWI, Delft University of Technology and |
---|
25 | % School of Computer Science, University of Manchester |
---|
26 | |
---|
27 | |
---|
28 | function d = blurdistm(A,B,ra,rb,fid) |
---|
29 | if nargin < 3, |
---|
30 | ra = 1; |
---|
31 | end |
---|
32 | if nargin < 4, |
---|
33 | rb = ra; |
---|
34 | end |
---|
35 | if nargin < 5, |
---|
36 | fid = 0; |
---|
37 | end |
---|
38 | |
---|
39 | [ma1,ma2,na] = size(A); |
---|
40 | [mb1,mb2,nb] = size(B); |
---|
41 | m = max([ma1,ma2,mb1,mb2]); |
---|
42 | d = zeros(na,nb); |
---|
43 | filta = exp(-[-ra:ra].^2/(0.5*ra*ra)); |
---|
44 | filta = filta./sum(filta); |
---|
45 | filtb = exp(-[-rb:rb].^2/(0.5*rb*rb)); |
---|
46 | filtb = filtb./sum(filtb); |
---|
47 | |
---|
48 | if fid > 0, |
---|
49 | figure(1); clf; |
---|
50 | figure(2); clf; |
---|
51 | end |
---|
52 | |
---|
53 | for i=1:na |
---|
54 | a = A(:,:,i); |
---|
55 | J = find(any(a)); |
---|
56 | J = [min(J):max(J)]; |
---|
57 | K = find(any(a')); |
---|
58 | K = [min(K):max(K)]; |
---|
59 | a = double(a(K,J)); |
---|
60 | |
---|
61 | % figure(1); imagesc(a); drawnow |
---|
62 | |
---|
63 | a = bord(a,0,ra); |
---|
64 | a = conv2(filta,filta,a,'same'); |
---|
65 | a = a(ra:end-ra,ra:end-ra); |
---|
66 | a = imresize(a,[32 32],'bilnear'); |
---|
67 | if fid > 0, |
---|
68 | figure(1); imagesc(a); drawnow |
---|
69 | end |
---|
70 | for j = 1:nb |
---|
71 | b = B(:,:,j); |
---|
72 | J = find(any(b)); |
---|
73 | J = [min(J):max(J)]; |
---|
74 | K = find(any(b')); |
---|
75 | K = [min(K):max(K)]; |
---|
76 | b = double(b(K,J)); |
---|
77 | b = bord(b,0,rb); |
---|
78 | b = conv2(filtb,filtb,b,'same'); |
---|
79 | b = b(rb:end-rb,rb:end-rb); |
---|
80 | b = imresize(b,[32 32],'bilnear'); |
---|
81 | d(i,j) = sqrt(sum((a(:)-b(:)).^2)); |
---|
82 | if fid > 0 |
---|
83 | fprintf(fid,'%5d %5d %10.3f \n',i,j,d(i,j)); |
---|
84 | figure(2); imagesc(b); drawnow; |
---|
85 | end |
---|
86 | end |
---|
87 | end |
---|