JPEG图像压缩探索_zigzag扫描(原创)

发布时间:2025-12-10 11:37:58 浏览次数:17

续:《DCT变换的应用》 http://t.csdn.cn/h1KmE

在DCT图像变换完成后,需要把数据从高频到低频频域强度信号进行筛选等操作,为了方便算法进行操作,最好转化为一个一维的数据,而如果每一行都从左到右写入到一维数据表中,会导致高频和低频频域信号混杂在整个表不同的部位,不方便进行霍夫曼编码等操作。

因此,zigzag扫描算法就派上用场了,也就是按照图上顺序,从左上到右下写成一维数据。

要顺利实现一个算法,要先清晰描述问题和现象,才方便找到规律,然后用程序语言描述。顺便也作为自己的一种推理能力训练。

分析图上规律,我认为可以分为两个部分进行数据写入:

1、图像分为两个部分,以包含最左下到最右上的对角线的部分为左三角形,右下部分则为右三角形:

2、左三角形部分写入规律,除(0,0)外,x方向游标x∈(1, 3, 5,7……)都是从当前点往左下移动,也就是x--(x>=0),y++;y方向游标y∈(2, 4, 6……)则是从当前点往右上,即x++,y--(y>=0)

3、右三角形部分写入规律,x方向游标x∈(1, 3, 5,7……)都是从当前点往右上移动,也就是x++(x<8),y--;右侧y方向游标y∈(2, 4, 6……)则是从当前点往左下,即x--,y++(y<8)

规律总结完毕,检查无漏,开始编写代码:

package com.cjztest.aboutJPEG;public class Ziggan {public static void main(String[] args) {int mGrayPixels[] = {80,60,34,10,5,1,94,0,56,30,5,4,1,86,0,0,23,6,3,1,80,0,0,0,15,2,1,75,0,0,0,0,1,1,75,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};/* * 左三角形部分:* 设向左下方前进为正方向,x轴起始点,1,3,5,7* 右上为正方向:y起始点:2,4,6* */ int matrixLen = 8;//先塞入第一个数int result[] = new int[matrixLen * matrixLen];result[0] = mGrayPixels[0];int resultOffset = 1;//开始遍历for (int offset = 1; offset < matrixLen; offset ++) {if (offset % 2 != 0) { //x起点for (int x = offset, y = 0; x >= 0; x--, y++) {result[resultOffset++] = mGrayPixels[x + y * matrixLen];}} else { //y起点for (int y = offset, x = 0; y >= 0; y--, x++) {result[resultOffset++] = mGrayPixels[x + y * matrixLen];}}}/*右三角形部分:* */for (int offset = 1; offset < matrixLen; offset ++) {if (offset % 2 != 0) { //x起点for (int x = offset, y = 7; x < matrixLen; x++, y--) {result[resultOffset++] = mGrayPixels[x + y * matrixLen];}} else { //y起点for (int y = offset, x = 7; y < matrixLen; y++, x--) {result[resultOffset++] = mGrayPixels[x + y * matrixLen];}}}//读取结果for (int i = 0; i < matrixLen * matrixLen; i++) {System.out.print(result[i] + ", ");if ((i + 1) % matrixLen == 0) {System.out.println();}}}}

运行结果:

80, 60, 56, 23, 30, 34, 10, 5,

6, 15, 1, 2, 3, 4, 5, 1,

1, 1, 1, 1, 1, 0, 0, 75,

75, 80, 86, 94, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0,

源码:

src/com/cjztest/aboutJPEG/Ziggan.java · lvlv/JavaPractice - 码云 - 开源中国 (gitee.com)

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477