|
ZIGZAG扫描的MATLAB实现(1)
转自阿须数码,用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
|