[10] | 1 | %EDGEDISTM Distance Matrix between Images based on Their Edges |
---|
| 2 | % |
---|
| 3 | % D = EDGEDISTM (A,B,DIST,K) |
---|
| 4 | % |
---|
| 5 | % INPUT |
---|
| 6 | % A Matrix of N binary images |
---|
| 7 | % B Matrix of M binary images |
---|
| 8 | % DIST Distance measure (optional; default: 'MHAUS') |
---|
| 9 | % 'HAUS' - Hausdorff distance |
---|
| 10 | % 'MHAUS' - modified Hausdorff distance |
---|
| 11 | % 'R75' - based on the 75th quantile |
---|
| 12 | % 'R90' - based on the 90th quantile |
---|
| 13 | % K Number of rows in an image if images are stored as row vectors |
---|
| 14 | % (optional; default: sqrt(size(A,1))) |
---|
| 15 | % |
---|
| 16 | % OUTPUT |
---|
| 17 | % D NxM dissimilarity matrix or dataset |
---|
| 18 | % |
---|
| 19 | % DESCRIPTION |
---|
| 20 | % Computes the distance matrix D between two sets of binary images, A and B. |
---|
| 21 | % First edges are extracted, then a distance defined by DIST is computed. |
---|
| 22 | % If the size of A is N x P and the size of B is M x P, then images are |
---|
| 23 | % stored as row vectors. P should be such that P = K*L, where K and L are |
---|
| 24 | % image sizes. |
---|
| 25 | % |
---|
| 26 | % If the size of A is Kx x LX x N and the size of B is KY x LY x M, then |
---|
| 27 | % images are stored as 2D arrays. |
---|
| 28 | % |
---|
| 29 | % If A and B are datasets, then D is a dataset as well with the labels defined |
---|
| 30 | % by the labels of A and the feature labels defined by the labels of B. If A is |
---|
| 31 | % not a dataset, but a matrix of doubles, then D is also a matrix of doubles. |
---|
| 32 | |
---|
| 33 | % Copyright: Robert P.W. Duin, r.p.w.duin@prtoos.org, Elzbieta Pekalska, ela.pekalska@googlemail.com |
---|
| 34 | % Faculty EWI, Delft University of Technology and |
---|
| 35 | % School of Computer Science, University of Manchester |
---|
| 36 | |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | function D = edgedistm (A,B,dist,k) |
---|
| 40 | |
---|
| 41 | if nargin < 3, |
---|
| 42 | dist = 'MHAUS'; |
---|
| 43 | else |
---|
| 44 | dist = upper(dist); |
---|
| 45 | end |
---|
| 46 | |
---|
| 47 | if nargin < 2, |
---|
| 48 | B = A; |
---|
| 49 | end |
---|
| 50 | |
---|
| 51 | switch ndims(A) |
---|
| 52 | case 2, |
---|
| 53 | isda = isdataset(A); |
---|
| 54 | isdb = isdataset(B); |
---|
| 55 | a = +A; |
---|
| 56 | b = +B; |
---|
| 57 | [ma, na] = size(a); |
---|
| 58 | |
---|
| 59 | if nargin < 4, |
---|
| 60 | k = round(sqrt(na)); |
---|
| 61 | end |
---|
| 62 | l = round(na/k); |
---|
| 63 | |
---|
| 64 | if (k * l) ~= na, |
---|
| 65 | error ('Sizes of the images are incorrect.'); |
---|
| 66 | end |
---|
| 67 | |
---|
| 68 | [mb, nb] = size(b); |
---|
| 69 | if na ~= nb, |
---|
| 70 | error ('Number of features should be the same.'); |
---|
| 71 | end |
---|
| 72 | |
---|
| 73 | D = zeros(ma,mb); |
---|
| 74 | for i=1:ma |
---|
| 75 | for j=1:mb |
---|
| 76 | [Ia,Ja] = find (edge (reshape (a(i,:),k,l),'canny')); |
---|
| 77 | [Ib,Jb] = find (edge (reshape (b(j,:),k,l),'canny')); |
---|
| 78 | D(i,j) = edist([Ia Ja],[Ib Jb],dist); |
---|
| 79 | end |
---|
| 80 | end |
---|
| 81 | |
---|
| 82 | % Set object labels and feature labels |
---|
| 83 | if xor(isda, isdb), |
---|
| 84 | prwarning(1,'One matrix is a dataset and the other not. ') |
---|
| 85 | end |
---|
| 86 | if isda, |
---|
| 87 | if isdb, |
---|
| 88 | D = setdata(A,D,getlab(B)); |
---|
| 89 | else |
---|
| 90 | D = setdata(A,D); |
---|
| 91 | end |
---|
| 92 | D.name = 'Distance matrix'; |
---|
| 93 | if ~isempty(A.name) |
---|
| 94 | D.name = [D.name ' for ' A.name]; |
---|
| 95 | end |
---|
| 96 | end |
---|
| 97 | |
---|
| 98 | case 3, |
---|
| 99 | [ka,la,ma] = size(a); |
---|
| 100 | [kb,lb,mb] = size(b); |
---|
| 101 | |
---|
| 102 | D = zeros(ma,mb); |
---|
| 103 | for i=1:ma |
---|
| 104 | for j=1:mb |
---|
| 105 | [Ia,Ja] = find (edge (a(:,:,i),'canny')); |
---|
| 106 | [Ib,Jb] = find (edge (b(:,:,j),'canny')); |
---|
| 107 | D(i,j) = edist ([Ia Ja],[Ib Jb],dist); |
---|
| 108 | end |
---|
| 109 | end |
---|
| 110 | |
---|
| 111 | otherwise |
---|
| 112 | error('The number of matrix''s dimensions should be 2 or 3.'); |
---|
| 113 | end |
---|
| 114 | |
---|
| 115 | D(find(D < eps)) = 0; |
---|
| 116 | return |
---|
| 117 | |
---|
| 118 | |
---|
| 119 | |
---|
| 120 | |
---|
| 121 | |
---|
| 122 | |
---|
| 123 | |
---|
| 124 | |
---|
| 125 | function dd = edist (aa,bb,dist) |
---|
| 126 | dab = sqrt(distm(aa,bb)); |
---|
| 127 | minab = min(dab); |
---|
| 128 | |
---|
| 129 | dba = sqrt(distm(bb,aa)); |
---|
| 130 | minba = min(dba); |
---|
| 131 | |
---|
| 132 | switch dist, |
---|
| 133 | case 'haus', |
---|
| 134 | dAB = max(minab); |
---|
| 135 | dBA = max(minba); |
---|
| 136 | |
---|
| 137 | case 'mhaus' |
---|
| 138 | dAB = mean(minab); |
---|
| 139 | dBA = mean(minba); |
---|
| 140 | |
---|
| 141 | case {'r75','r90'} |
---|
| 142 | if strcmp(dist,'r75') |
---|
| 143 | r = 75; |
---|
| 144 | else |
---|
| 145 | r = 90; |
---|
| 146 | end; |
---|
| 147 | minab = sort(minab); |
---|
| 148 | dAB = minab(round (r/ma)); |
---|
| 149 | minba = sort(minba); |
---|
| 150 | dBA = minba(round (r/mb)); |
---|
| 151 | otherwise |
---|
| 152 | error ('Wrong distance measure.') |
---|
| 153 | end |
---|
| 154 | |
---|
| 155 | dd = max(dBA, dAB); |
---|
| 156 | return |
---|