ZIGZAG扫描的MATLAB实现 - feisky
2004年10月29日 18:29:00
转自阿须数码,用MATLAB实现MPEG中的
ZIG-ZAG 扫描。觉得有点研究价值,实现的方法也很巧妙。
下面给一个参照MPEG提供的方法:
===
function b=zigzag(a)
% 这是参照 University of California 提供的 MPEG
源代码的基础上编制的。
% Copyright (c) 1995 The Regents of the University of
California.
[n,m]=size(a);
if(n~=8 & m~=8)
error(\’Input array is NOT
8-by-8\’);
end
% Set up array for fast conversion from row/column coordinates
to
% zig zag order. 下标从零开始,因为是从MPEG的C代码拷贝过来的
zigzag = [ 0, 1, 8, 16, 9, 2, 3, 10, …
17, 24, 32, 25, 18, 11, 4, 5, …
12, 19, 26, 33, 40, 48, 41, 34, …
27, 20, 13, 6, 7, 14, 21, 28, …
35, 42, 49, 56, 57, 50, 43, 36, …
29, 22, 15, 23, 30, 37, 44, 51, …
58, 59, 52, 45, 38, 31, 39, 46, …
53, 60, 61, 54, 47, 55, 62, 63];
zigzag = zigzag + 1; %
下标加1,符合MATLAB的下标习惯
aa = reshape(a,1,64); % 将输入块变成1×64的向量
b = aa(zigzag); % 对 aa 按照查表方式取元素,得到 zig-zag
扫描结果
===
程序运行结果:
?a=magic(8)
a =
64
2
3
61
60
6
7 57
9
55
54
12
13
51
50 16
17
47
46
20
21
43
42 24
40
26
27
37
36
30
31 33
32
34
35
29
28
38
39 25
41
23
22
44
45
19
18 48
49
15
14
52
53
11
10 56
8
58
59
5
4
62
63
1
?b=zigzag(a)
b =
Columns 1 through 12
64
9
2
3
55
17
40
47
54
61
60 12
Columns 13 through 24
46
26
32
41
34
27
20
13
6
7
51 21
Columns 25 through 36
37
35
23
49
8
15
22
29
36
43
50 57
Columns 37 through 48
16
42
30
28
44
14
58
59
52
45
38 31
Columns 49 through 60
24
33
39
19
53
5
4
11
18
25
48 10
Columns 61 through 64
62
63
56
1
Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=158885