z型编码在图像处理中是十分重要的,进而突出学习其思想的重要性。该篇旨在讨论其思想,实现其效果,在算法的效率上没有过多的考虑。
其思想过程如下所示:
z字形编排程序:
0 1 2 3 4
8 9 10 12 13 z编排
17 18 19 20 21 -----------> 0->1->8->17->9->2->3->10->18->25->33->26->19->12->4->13
25 26 27 28 29 ->20->27->34->35->28->21->29->36->37
33 34 35 36 37
对于目标矩阵 matrix[i][j]:
1、 j为偶数,且i = 0 或者 i = 7,则水平相右移一格
2、 数组i为奇数,且j = 0或者 j = 7,则向下移一格
3、 i + j为偶数时,则右上移一格,反之,则左下移一格
源代码:
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
const int SIZE = 8;
int main(void){
int matrix[SIZE][SIZE] = {0};
int result[SIZE][SIZE] = {0};
int i,j;
int *p;
p = &matrix[0][0];
for(i = 0;i < SIZE*SIZE;i ++)
*p++ = i;
cout<<"init array:"<<endl;
for(i = 0;i < SIZE;i ++){
cout<<" ";
for(j = 0;j < SIZE;j ++){
cout<<setw(4)<<*(*(matrix + i) + j);
}
cout<<endl;
}
i = j = 0;
for(int x = 0;x < SIZE;x ++)
for(int y = 0;y < SIZE;y ++){
*(*(result + x) + y) = *(*(matrix + i) + j);
if(j%2 == 0 && (i == 0||i == 7))// matrix[i][j]数组j为偶数,且i = 0 或者 i = 7,则水平相右移一格
{
j ++;
continue;
}
if(i%2 != 0 && (j == 0||j == 7))//matrix[i][j]数组i为奇数,且j = 0或者 j = 7,则向下移一格
{
i ++;
continue;
}
else if((i + j) % 2 == 0)//matrix[i][j]数组i + j为偶数时,则右上移一格,反之,则左下移一格
{
i --;
j ++;
continue;
}
else{
i ++;
j --;
continue;
}
}
cout<<endl<<"after zigzag arragement:"<<endl;
for(i = 0;i < SIZE;i ++){
cout<<" ";
for(j = 0;j < SIZE;j ++)
cout<<setw(4)<<*(*(result + i) + j);
cout<<endl;
}
return 0;
}