DCT蝶形运算java实现

DCT运算实现,其原理是离散余弦算法。将信号转到频域中。

以下代码经验证是正确的

代码如下,包括对一维数据和二维数据:

<pre name="code" class="java">/**
 * author:vivian
 * 时间:2015.5.28
 * 版本:第一版
 * 功能:8点快速傅里叶运算,用的是蝶形运算方法
 * 
 * 各方法的功能
 * 1)IntDCT1D针对的是一维的数据,进行8点蝶形运算
 * 2)I_IntDCT1D一维数据的8点蝶形逆运算
 * 3)IntDCT2D针对的是二维的数据,进行8点蝶形运算
 * 4)I_IntDCT1D二维数据的8点蝶形逆运算*/

 




public class DCT2D{


	public void IntDCT1D(int data[])
	{

		       input   x0 x1 ... x7
		       output  X0 X2 X4 X6 X1 X3 X5 X7
		  
		int datatmp[] = new int [8];
		datatmp[0] = data[0] + data[7];
		datatmp[1] = data[1] + data[6];
		datatmp[2] = data[2] + data[5];
		datatmp[3] = data[3] + data[4];
		datatmp[4] = data[3] - data[4];
		datatmp[5] = data[2] - data[5];
		datatmp[6] = data[1] - data[6];
		datatmp[7] = data[0] - data[7];
		//蝶形运算结束
		data[0] = datatmp[0] + datatmp[3];
		data[1] = datatmp[1] + datatmp[2];
		data[2] = datatmp[1] - datatmp[2];
		data[3] = datatmp[0] - datatmp[3];

		data[0] += data[1];                     data[0] = X0
		data[1] = - data[1] + ((data[0])>>1);     /// data[1] = X4

		data[3] = data[3] - (data[2] >>1) - (data[2] >>3); 
		data[2] += data[3];
		data[3] = data[3] - (data[2] >>1) - (data[2] >>3); 
		// data[2] = X2    data[3] = X6

		datatmp[5] = datatmp[5] - (datatmp[6] >>1) + (datatmp[6] >>4);
		datatmp[6] = datatmp[6] + (datatmp[5] >>1) + (datatmp[5] >>2);
		datatmp[5] = - datatmp[5] + (datatmp[6] >>1) - (datatmp[6] >>4);

		data[4] = datatmp[4] + datatmp[5];
		data[5] = datatmp[4] - datatmp[5];
		data[6] = -datatmp[6] + datatmp[7];
		data[7] = datatmp[6] + datatmp[7];

		data[7] = data[7] - (data[4] >>1) -(data[4] >>2) -(data[4] >>4);
		data[4] = data[4] + data[7];
		data[7] = data[7] - (data[4] >>1) -(data[4] >>2) -(data[4] >>4);
		// data[4] = X1      data[7] = X7

		data[6] = data[6] - (data[5] >>2);
		data[5] = data[5] + (data[6] >>1);
		data[6] = data[6] - (data[5] >>2);
		// data[5] = X3    data[7] = X5

		/*   datatmp[0] = data[0];            datatmp[1] = data[2];
		datatmp[2] = data[1];    datatmp[3] = data[3];
		datatmp[4] = data[4];    datatmp[5] = data[6];
		datatmp[6] = data[5];    datatmp[7] = data[7];
		*/
		datatmp[0] = data[0];    datatmp[1] = data[4];
		datatmp[2] = data[2];    datatmp[3] = data[6];
		datatmp[4] = data[1];    datatmp[5] = data[5];
		datatmp[6] = data[3];    datatmp[7] = data[7];

		int i;
		for (i=0; i<8; i++)  data[i] = datatmp[i];
	

	}

	void I_IntDCT1D(int data[])
	{

		///
		///        input X0, X2, X4, X6, X1, X3, X5, X7           
		      output x0, x1,x2, ..., x7

		int datatmp[] = new int [8];
		int i;
		for (i=0; i<8; i++)  datatmp[i] = data[i];
		data[0] = datatmp[0];    data[1] = datatmp[2];
		data[2] = datatmp[4];    data[3] = datatmp[6] ;
		data[4] = datatmp[1];    data[5] = datatmp[3];
		data[6] = datatmp[5];    data[7] = datatmp[7];

		datatmp[1] = - data[2] + (data[0]>>1);
		datatmp[0] = data[0] - datatmp[1];

		datatmp[3] = data[3] + (data[1] >>1) +(data[1] >>3);
		datatmp[2] = data[1] - datatmp[3];
		datatmp[3] = datatmp[3] +(datatmp[2] >>1) +(datatmp[2] >>3);

		datatmp[6] = data[5] + (data[6] >>2);
		datatmp[5] = data[6] - (datatmp[6] >>1);
		datatmp[6] = datatmp[6] + (datatmp[5] >>2);

		datatmp[7] = data[7] + (data[4] >>1) + (data[4] >>2) + (data[4] >>4);
		datatmp[4] = data[4] - datatmp[7];
		datatmp[7] = datatmp[7] + (datatmp[4] >>1) + (datatmp[4] >>2) + (datatmp[4] >>4);
		// four inverse lifting step

		data[0] = (datatmp[0] + datatmp[3]) >>1;
		data[3] = (datatmp[0] - datatmp[3]) >>1;
		data[1] = (datatmp[1] + datatmp[2]) >>1;
		data[2] = (datatmp[1] - datatmp[2]) >>1;

		data[4] = (datatmp[4] + datatmp[5]) >>1;
		data[5] = (datatmp[4] - datatmp[5]) >>1;
		data[6] = (- datatmp[6] + datatmp[7]) >>1;
		data[7] = (datatmp[6] + datatmp[7]) >>1;
		// four inverse butterfly

		data[5] = - data[5] + (data[6] >>1) - (data[6] >>4);
		data[6] = data[6] - (data[5] >>1) - (data[5] >>2);
		data[5] = data[5] + (data[6] >>1) - (data[6] >>4);

		/
		datatmp[0] = (data[0] + data[7]) >>1;
		datatmp[1] = (data[1] + data[6]) >>1;
		datatmp[2] = (data[2] + data[5]) >>1;
		datatmp[3] = (data[3] + data[4]) >>1;
		datatmp[4] = (data[3] - data[4]) >>1;
		datatmp[5] = (data[2] - data[5]) >>1;
		datatmp[6] = (data[1] - data[6]) >>1;
		datatmp[7] = (data[0] - data[7]) >>1;

		//int i;
		for(i=0; i<8; i++) data[i] = datatmp[i];
	}

	public void IntDCT2D(int data[][], int height, int width)
	{

		int nheight, nwidth;
		int i, j, k, l;
		int ni, nj;   //纪录处理数据的位置

		int datatmp[] = new int [8];
		nheight = height >>3;
		nwidth = width >>3;

		ni = 0;
		for (i=0; i<nheight; i++)
		{

			nj = 0;
			for (j=0; j<nwidth; j++)
			{
				//对行做变换
				for (k=0; k<8; k++)
				{

					for (l=0; l<8; l++)
						datatmp[l] = data[ni+k][nj+l];
						IntDCT1D(datatmp);
					for (l=0; l<8; l++)
						data[ni+k][nj+l] = datatmp[l];

				}
				对列做变换
				for (k=0; k<8; k++)
				{

					for (l=0; l<8; l++)
						datatmp[l] = data[ni+l][nj+k];
					IntDCT1D(datatmp);
					for (l=0; l<8; l++)
						data[ni+l][nj+k] = datatmp[l];

				}
				nj = nj + 8;

			}
			ni = ni + 8;

		}


	}

public	void I_IntDCT2D(int data[][], int height, int width)
	{

		int nheight, nwidth;
		int i, j, k, l;
		int ni, nj;   //纪录处理数据的位置

		int datatmp[] = new int [8];
		nheight = height >>3;
		nwidth = width >>3;

		ni = 0;
		for (i=0; i<nheight; i++)
		{

			nj = 0;
			for (j=0; j<nwidth; j++)
			{

				对列做反变换
				for (k=0; k<8; k++)
				{

					for (l=0; l<8; l++)
						datatmp[l] = data[ni+l][nj+k];
					I_IntDCT1D(datatmp);
					for (l=0; l<8; l++)
						data[ni+l][nj+k] = datatmp[l];

				}

				//对行做反变换
				for (k=0; k<8; k++)
				{

					for (l=0; l<8; l++)
						datatmp[l] = data[ni+k][nj+l];
					I_IntDCT1D(datatmp);
					for (l=0; l<8; l++)
						data[ni+k][nj+l] = datatmp[l];

				}
				nj = nj + 8;

			}
			ni = ni + 8;

		}


	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
信息隐藏是一种将附加数据嵌入到主数据中的技术,以便在传输或存储过程中对其进行保护或认证。DCT(离散余弦变换)是一种常用的数字图像处理技术,可以将图像转换为频域表示。在DCT域中,我们可以将水印嵌入到图像中,实现信息隐藏。 要在Java实现DCT域水印,可以按照以下步骤进行: 1. 加载源图像和水印图像:首先,从文件系统中加载源图像和水印图像。可以使用Java中的图像处理库(如Java Advanced Imaging API)来加载和处理图像。 2. 进行离散余弦变换(DCT):使用Java库中的函数对源图像进行DCT变换。这将将图像从空间域转换为频域。 3. 对水印图像进行预处理:对水印图像进行必要的预处理,如调整大小和灰度化。确保水印图像的大小与源图像匹配,并且都是灰度图像。 4. 将水印图像嵌入到源图像:将水印图像的像素值嵌入到DCT变换的系数中。可以通过调整DCT系数的幅度或相位来嵌入水印。确保嵌入的水印不会显著改变图像的视觉质量。 5. 逆DCT变换:将嵌入了水印的DCT系数进行逆变换,将图像从频域恢复到空间域。这将得到带有水印的图像。 6. 保存带有水印的图像:将带有水印的图像保存到文件系统中,以供进一步使用或传输。 以上就是信息隐藏DCT域水印的Java实现的基本步骤。实际上,还可以根据需求进行更高级的操作,例如加密水印、扩展到视频或音频等。使用Java的图像处理库,我们可以方便地实现这些功能,并保护我们的信息免受未经授权的访问和篡改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值