java实现zigzag扫描
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
链接中有直接可执行的java文件
二维数组扫描后变成一维数组
public static int[] two2one(final int input[][]) {int n = 0, x = 0, y = 0;int []output=new int [N*N];output[n] = input[x][y];n++;while (true) {if (x == 0 && y <= N - 2) {y++;output[n] = input[x][y];n++;while (true) {x++;y--;output[n] = input[x][y];n++;if (y == 0) {break;}}}if (y == 0 && x <= N - 2) {x++;output[n] = input[x][y];n++;while (true) {x--;y++;output[n] = input[x][y];n++;if (x == 0) {break;}}}if (x == N - 1 && y < N - 2) {y++;output[n] = input[x][y];n++;while (true) {x--;y++;output[n] = input[x][y];n++;if (y == N - 1) {break;}}}if (y == N - 1 && x < N - 2) {x++;output[n] = input[x][y];n++;while (true) {x++;y--;output[n] = input[x][y];n++;if (x == N - 1) {break;}}}if (x == N - 1 && y == N - 2) {y++;output[n] = input[x][y];break;}}// whilereturn output;}
扫描后的一维数据还原成二维数组
public static int[][] one2two(final int input[]) {int n = 0, x = 0, y = 0;int [][]output=new int [N][N];output[x][y] = input[n];n++;while (true) {if (x == 0 && y <= N - 2) {y++;output[x][y] = input[n];n++;while (true) {x++;y--;output[x][y] = input[n];n++;if (y == 0) {break;}}}if (y == 0 && x <= N - 2) {x++;output[x][y] = input[n];n++;while (true) {x--;y++;output[x][y] = input[n];n++;if (x == 0) {break;}}}if (x == N - 1 && y < N - 2) {y++;output[x][y] = input[n];n++;while (true) {x--;y++;output[x][y] = input[n];n++;if (y == N - 1) {break;}}}if (y == N - 1 && x < N - 2) {x++;output[x][y] = input[n];n++;while (true) {x++;y--;output[x][y] = input[n];n++;if (x == N - 1) {break;}}}if (x == N - 1 && y == N - 2) {y++;output[x][y] = input[n];break;}}// whilereturn output;}