-
Notifications
You must be signed in to change notification settings - Fork 4
/
zigzag.m
172 lines (145 loc) · 4.77 KB
/
zigzag.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
function seq = zigzag(SI)
%
% Description:
% ------------
% This function is used to build the corresponding sequences of a given
% scaled gray level image matrix from 45' degree direction. The whole process is using zigzag method
% It can handle nonsquare image matrix
%
% Author:
% -------
% (C)Xunkai Wei <[email protected]>
% Beijing Aeronautical Technology Research Center
% Beijing %9203-12,10076
%
% History:
% -------
% Creation: beta Date: 01/11/2007
% Revision: 1.0 Date: 12/11/2007
%
% Trick: all the sequence starts or ends lie on the boundary.
% initializing the variables
%----------------------------------
c = 1; % initialize colum indicator
r = 1; % initialize row indicator
rmin = 1; % row boundary checker
cmin = 1; % colum boundary checker
rmax = size(SI, 1); % get row numbers
cmax = size(SI, 2); % get colum numbers
%
i = 1; % counter for current ith element
j = 1; % indicator for determining sequence interval
% intialize sequence mark
sq_up_begin=1;
sq_down_begin=1;
% % Output contain value and its flag status
% the first row contain value
% the second row contain its flag
output = zeros(1, rmax * cmax);
% sequence counter
%
% % Position Matrix
% position =zeros(1, rmax * cmax);
%----------------------------------
while ((r <= rmax) && (c <= cmax))
% for current point, judge its zigzag direction up 45, or down 45, or
% 0,or down 90
if (mod(c + r, 2) == 0) % up 45 direction
% if we currently walk to the left first colum
if (r == rmin)
% First, record current point
output(i) = SI(r, c);
% if we walk to right last colum
if (c == cmax)
% add row number move straight down 90
r = r + 1;
sq_up_end = i;
sq_down_begin = i+1;
seq{j}=output(sq_up_begin:sq_up_end);
j = j + 1;
%
else
% Continue to move to next (1,c+1) point
% This next point should be the begin point of next sequence
c = c + 1;
sq_up_end = i;
sq_down_begin = i+1;
seq{j}=output(sq_up_begin:sq_up_end);
j = j + 1;
end;
% add couter
i = i + 1;
% if we currently walk to the last column
elseif ((c == cmax) && (r < rmax))
% first record the point
output(i) = SI(r, c);
% then move straight down to next row
r = r + 1;
sq_up_end = i;
seq{j}=output(sq_up_begin:sq_up_end);
sq_down_begin =i+1;
j=j+1;
% add counter
i = i + 1;
% all other cases i.e. nonboundary points
elseif ((r > rmin) && (c < cmax))
output(i) = SI(r, c);
% move to next up 45 point
r = r - 1;
c = c + 1;
% add counter
i = i + 1;
end;
% down 45 direction
else
% if we walk to the last row
if ((r == rmax) && (c <= cmax))
% firstly record current point
output(i) = SI(r, c);
% move right to next point
c = c + 1;
sq_down_end = i;
seq{j}=output(sq_down_begin:sq_down_end);
sq_up_begin =i+1;
j = j + 1;
% add counter
i = i + 1;
% if we walk to the first column
elseif (c == cmin)
%first record current point
output(i) = SI(r, c);
%
if (r == rmax)
c = c + 1;
sq_down_end = i;
seq{j}=output(sq_down_begin:sq_down_end);
sq_up_begin =i+1;
j = j + 1;
else
r = r + 1;
% record sequence end
sq_down_end = i;
seq{j}=output(sq_down_begin:sq_down_end);
sq_up_begin =i+1;
j = j + 1;
end;
i = i + 1;
% all other cases without boundary point
elseif ((r < rmax) && (c > cmin))
%
output(i) = SI(r, c);
% position(i) = sub2ind(SI,r,c);
r = r + 1;
c = c - 1;
% keep down_info
i = i + 1;
end;
end;
if ((r == rmax) && (c == cmax)) % bottom right element
output(i) = SI(r, c);
sq_end = i;
seq{j}=output(sq_end);
% position(i) = sub2ind(SI,r,c);
break
end;
end;