ZIGZAG扫描的MATLAB实现

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

转自阿须数码,用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); % 将输入块变成1x64的向量

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航