ZigZag变换_保存版!

//ZigZag.cpp

 #include "Zigzag.h"

 
void ZigZag(float *DCTMatrix,int width,int height,float *zigzagVector)
{
int h = 1,v = 1;
int vmin = 1,hmin = 1;
int vmax = height, hmax = width;    //vertical, horizontal
int i;
memset(zigzagVector, 0, sizeof(float) * height * width );
 
i=1;
while(v<=vmax && h<=hmax)
{
if((h+v)%2==0)
{
if(v==vmin)
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
if(h==hmax)
v=v+1;
else
h=h+1;
i=i+1;
}
else if((h==hmax) && (v<vmax))
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
v=v+1;
i=i+1;
}
else if((v>vmin) && (h<hmax))
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
v=v-1;
h=h+1;
i=i+1;
}
}
else
{
if((v==vmax) && (h<=hmax))
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
h=h+1;
i=i+1;
}
else if(h==hmin)
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
if(v==vmax)
h=h+1;
else
v=v+1;
i=i+1;
}
else if((v<vmax) && (h>hmin))
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
v=v+1;
h=h-1;
i=i+1;
}
}
if((v==vmax) && (h==hmax))
{
zigzagVector[i-1]=*(DCTMatrix + width*(v-1) + h-1);
break;
}
}
}
 
void iZigZag(float *zigzagVector,int width,int height,float* DCTMatrix)
{
int h = 1,v = 1;
int vmin = 1,hmin = 1;
int vmax = height,hmax = width;
int i;
 
memset(DCTMatrix, 0, sizeof(float) * height * width );
i=1;
 
while(v<=vmax && h<=hmax)
{
if((h+v)%2==0)
{
if(v==vmin)
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
if(h==hmax)
v=v+1;
else
h=h+1;
i=i+1;
}
else if((h==hmax) && (v<vmax))
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
v=v+1;
i=i+1;
}
else if((v>vmin) && (h<hmax))
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
v=v-1;
h=h+1;
i=i+1;
}
}
else
{
if((v==vmax) && (h<=hmax))
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
h=h+1;
i=i+1;
}
else if(h==hmin)
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
if(v==vmax)
h=h+1;
else
v=v+1;
i=i+1;
}
else if((v<vmax) && (h>hmin))
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
v=v+1;
h=h-1;
i=i+1;
}
}
if((v==vmax) && (h==hmax))
{
*(DCTMatrix + width*(v-1) + h-1)=zigzagVector[i-1];
break;
}
}
}
 
 
 
// Zigzag.h
 
#ifndef _Zigzag_H
#define _Zigzag_H
 
#include <stdlib.h>
#include <string.h>
 
#ifdef __cplusplus
extern "C" {
#endif
 
void ZigZag(float *DCTMatrix,int width,int height,float *zigzagVector);
void iZigZag(float *zigzagVector,int width,int height,float* DCTMatrix);//inverse Zigzag!
 
#ifdef __cplusplus
}
#endif
 
#endif
 
 
 
//main.cpp
#include <iostream>
#include <iomanip>
#include "Zigzag.h"
#include <vector>
using namespace std;
 
int main()
{
int i,j;
float  * orig = new float[8*8];
for(i = 0 ; i < 8*8; i++ )
{
*(orig +i) =  rand() %255;
}
float * zigzagVector = new float[8*8];
memset(zigzagVector , 0 ,sizeof(float) * 8 *8);
cout<<"原始的8*8的矩阵如下:"<<endl;
for(i = 0; i < 8; i++)
{
for(j = 0; j< 8; j++)
{
cout<<setw(4)<<*(orig + i * 8 +j);
}
cout<<endl;
}
//ZigZag变换
ZigZag(orig,8,8,zigzagVector);
 
cout<<"原矩阵左上角的4*4的矩阵如下:"<<endl;
vector<int> vec;
for(i = 0; i < 8; i++)
{
for(j = 0;j < 8;++j)
{
vec.push_back(*(zigzagVector + i * 8 +j));
}
}
for(vector<int>::size_type i = 0; i < 10; ++i)
{
cout <<" "<<vec[i];
}
cout <<endl;
float * iorig = new float[8*8];
 
memset(iorig, 0, sizeof(float) * 8 * 8);
 
iZigZag(zigzagVector,8,8,iorig);//zigzag逆变换
 
cout<<"izigzag的8*8的矩阵如下:"<<endl;
for(i = 0; i < 8; i++)
{
for(j = 0; j< 8; j++)
{
cout<<setw(4)<<*(iorig + i * 8 +j);
}
cout<<endl;
}
return 0;
}
 
 版权声明:我师哥在网上找的资料,并加以修改
 
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值