-
Notifications
You must be signed in to change notification settings - Fork 0
/
getColorMatchFeatures.m
94 lines (61 loc) · 2.42 KB
/
getColorMatchFeatures.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
%% ([piece1, piece2], [side1, side2])
function [prob] = getColorMatchFeatures(pieces, sides, img)
side1Array = getSideArray(pieces(1), sides(1), img);
side2Array = getSideArray(pieces(2), sides(2), img);
% piece 2 needs to be flipped for direct comparison with piece 1
side2Array = flipud(side2Array);
% get the means for each segment of a side
side1Means = getRGBmeans(side1Array);
side2Means = getRGBmeans(side2Array);
%% find the color distance and normalize value
prob = RGBDistanceProb(side1Means, side2Means);
end
function RGBmeans = getRGBmeans(sideArray)
step = floor(length(sideArray)/3);
RGBmeans = [];
for i = 1:3
tempArray = sideArray((i-1)*step + 1:i*step, :,:);
Rmean = mean(tempArray(:,1,1));
Gmean = mean(tempArray(:,1,2));
Bmean = mean(tempArray(:,1,3));
RGBmeans = cat(1,RGBmeans, [Rmean, Gmean, Bmean]);
end
end
function sideArray = getSideArray(piece, side, img)
% create side array for piece
piecePerm = piece.Perimeter;
% find first corner index in perimeter vector
pieceCorner1 = piece.Corners(side,:);
[~, pieceIndex1] = ismember(pieceCorner1, piecePerm, 'rows');
% find second corner index in perimeter vector
pieceCorner2 = piece.Corners(mod(side,4) + 1, :);
[~, pieceIndex2] = ismember(pieceCorner2, piecePerm, 'rows');
if side==4
sideIndexArray = [piecePerm(pieceIndex1 : end,:); piecePerm(1 : pieceIndex2,:)];
else
sideIndexArray = piecePerm(pieceIndex1 : pieceIndex2,:);
end
% create array of image data from the side indices
sideArray = [];
for i = 1:length(sideIndexArray)
sideArray = cat(1, sideArray, img(sideIndexArray(i,1), sideIndexArray(i,2), :) );
end
end
function totalProb = RGBDistanceProb(means1, means2)
totalProb = zeros(1,3);
for i=1:3
RGB1 = means1(i,:);
RGB2 = means2(i,:);
a1 = (RGB1(1) - RGB2(1))^2;
a2 = (RGB1(2) - RGB2(2))^2;
a3 = (RGB1(3) - RGB2(3))^2;
colorDistance = sqrt(a1+a2+a3);
prob = normalizeProbability(colorDistance);
totalProb(i) = prob;
end
end
function prob = normalizeProbability(colorDistance)
maxDistance = sqrt(255^2 + 255^2 + 255^2);
distanceRatio = colorDistance/maxDistance;
prob = 1-distanceRatio;
end