JPEG图像压缩探索_zigzag扫描(原创)
续:《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)
JPEG图像压缩探索_zigzag扫描(原创)相关推荐
- JPEG图像压缩探索_DCT变换的应用
目录 为什么写这篇文章: 一.傅里叶变换简介 二.DCT是什么 三.DCT在图像有损压缩中的应用 1.图像有损压缩的依据点: 2.使用DCT进行图像有损压缩的具体操作: 3.使用IDCT进行图像解压缩 ...
- 基于DCT变换的JPEG图像压缩原理
1.为什么要进行图像压缩 众所周知,当今人类社会具有三大支柱,即物质.能量.信息.当下已由物质过渡到信息,从农业现代化到工业现代化,再到当今的信息化时代.信息具有通用性.抽象性.无限性.其通用性表现在 ...
- 基于DCT变换的JPEG图像压缩
基于DCT变换的JPEG图像压缩 摘 要:图像和视频通常在计算机中表示会占用非常大的空间,而出于节省硬盘空间的考虑,往往要进行压缩.而随着网络的发展,图像压缩技术越来越被人所重视.DCT变换是图像压缩 ...
- 基于DCT变换的JPEG图像压缩原理与JPEG2000编解码原理
目录 参考文章 基于DCT变换的JPEG图像压缩原理 图像数据压缩 图像处理 为什么可以进行图像压缩? 颜色空间转换 RGB CMY HSV/HSI/HSB/HSL YUV/YCbCr YCbCr与R ...
- 令人拍案叫绝的JPEG图像压缩原理
作者 | Jack Sigmoid 编辑 | 3D视觉开发者社区 前言 从事各行各业的大佬们,我相信,你们对图像格式是不陌生的,有很多种图像格式,比如,png,jpeg等等,但是你发现,同一张图片, ...
- JPEG图像压缩解压算法——C++实现
兹于2017年11月,应<多媒体技术基础>课程实验的要求,本人就基于JPEG图像压缩解压算法做了较为深入的理解,用C++语言实现JPEG图像压缩解压算法. JPEG图像压缩解压算法 一.实 ...
- Baumer工业相机堡盟相机如何使用JPEG图像压缩功能(LXT.JP系列相机图像压缩功能的使用和优点以及行业应用)(C#)
项目场景 Baumer工业相机堡盟相机是一种高性能.高质量的工业相机,可用于各种应用场景,如物体检测.计数和识别.运动分析和图像处理. Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分 ...
- 压缩减小图像大小技巧:8个最佳 JPEG 图像压缩软件
如果您必须压缩以减小特定图像的大小,Jpeg 图像压缩软件可能会有很大用处.您无需自己动手,只需将图像上传到各种软件,等待工作完成即可.然而,大多数人通常对他们应该选择哪种软件感到困惑,因为可供选择的 ...
- 程序员看的JPEG图像压缩介绍(多图慎入)
目录 1.介绍 2.数据压缩的前提 3.基于DCT的JPEG压缩编码流程 3.1 色相转换 3.2 区块切割与采样 3.3 离散余弦变换 3.4 DCT量化过程 3.5 Z字型编码过程 3.6 DC系 ...
最新文章
- matlab game of life,模拟器cellular auotomata元胞自动机 matlab
- mycat mysql 主从切换_Mycat读写分离与主从切换
- phpstorm PHP language level无法选择
- 必备知识:大数据处理应遵循的原则
- 删除 java代码中所有的注释
- 【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
- 背包问题回溯法c语言程序,C语言回溯法解决背包问题
- 全国省市县oracle,最新行政区划 省市区三级 街道乡镇四级 社区/村五级 每月更新(2021年4月版)...
- html网页设计字体变色,网页制作怎么改变字体颜色
- 4根网线水晶头接法(8根只接4根即可通讯)
- maya镜像模型但不改变点序 对称操作
- 图形算法:圆形生成算法
- gaussDB200 单节点安装
- DDR3 MIG上板测试记录
- OneNote for windows10卸载及重装
- AWS攻略——Peering连接VPC
- jQuery伪类选择器
- oracle 的dba users表,oracle DBA 常用表和视图
- 华为和字节,终于被时代驱赶到了同一条赛道上
- AI 助力垃圾分类(百度云API接口+摄像头实现)