-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmerge.m
66 lines (53 loc) · 1.23 KB
/
merge.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
function [ outLabels, mapping ] = merge( I, labels )
%MERGE Merges image segments based on mean color similarity.
minLabel = min(min(labels));
labels = labels - minLabel + 1;
numLabels = max(max(labels));
outLabels = zeros(size(labels));
A = segmentAdjacency(labels);
N = size(I,1)*size(I,2);
I = reshape(I, [N, 3]);
labels = reshape(labels, [N,1]);
B = zeros(numLabels,3);
C = zeros(numLabels,numLabels);
merged = zeros(numLabels,1,'int8');
mapping = zeros(numLabels,1);
for label = 1:numLabels
D = I(labels==label,:);
B(label,:) = mean(D,1);
end
for i=1:numLabels
for j=i+1:numLabels
if( A(i,j) == 0 )
continue;
end
C(i,j) = exp(-norm(B(i,:)-B(j,:)));
end
end
label = 1;
while( true )
[val,k] = max(C(:));
if( val < 0.90 )
break;
end
[i,j] = ind2sub([numLabels,numLabels],k);
merged(i) = 1;
merged(j) = 1;
C(i,:) = 0;
C(:,i) = 0;
C(j,:) = 0;
C(:,j) = 0;
outLabels( labels==i | labels==j ) = label;
mapping(i) = label;
mapping(j) = label;
label = label+1;
end
for i=1:numLabels
if( merged(i) )
continue;
end
outLabels( labels==i ) = label;
mapping(i) = label;
label = label+1;
end
end