-
Notifications
You must be signed in to change notification settings - Fork 0
/
horizontal_seam.m
70 lines (60 loc) · 1.76 KB
/
horizontal_seam.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
function [ S ] = horizontal_seam( I )
% horizontal_seam.m takes image I and chooses one optimal horizontal seam
% and returns a vector S of row values at each column.
% compute energy function
E = imenergy( I );
% copy first column
M = E;
% iterate over each pixel in I
for col = 2:size(I,2)
for row = 1:size(I,1)
% check boundary positions, calculate minimum of two or three
% neighboring cumulative minimum energy function entries
if (row == 1)
a = [M(row,col-1),M(row+1,col-1)];
minE = min(a);
elseif (row == size(I,1))
b = [M(row-1,col-1),M(row,col-1)];
minE = min(b);
else
c = [M(row-1,col-1),M(row,col-1),M(row+1,col-1)];
minE = min(c);
end
% compute cumulative minimum energy array M
M(row,col) = E(row,col) + minE;
end
end
%M = permute(M,[2 1 3]);
%imagesc(M);
%M = permute(M,[2 1 3]);
% calculate index of lowest cumulative energy value in last column
[C,index] = min(M(:,size(I,2)));
% initialize vector S
S = zeros(1,size(I,2));
S(size(I,2)) = index;
col = size(I,2) - 1;
while (col > 0)
if (index == 1)
[a indexstep] = min(M(index:index+1,col));
if (indexstep == 2)
index = index + 1;
end
elseif (index == size(I,1))
[b indexstep] = min(M(index-1:index,col));
if (indexstep == 1)
index = index - 1;
end
else
[c indexstep] = min(M(index-1:index+1,col));
if (indexstep == 1)
index = index - 1;
elseif (indexstep == 3)
index = index + 1;
end
end
S(col) = index;
col = col - 1;
end
% imshow(I)
% hold on;
end