# 简介
## 硬件
  主控芯片:STM32F407ZET6
  拓展内存:IS62WV51216BLL(1Mbyte)
  液晶显示:ILI9341彩屏(320*240像素)
  原图信息:320*240像素、RGB565模式的lenna局部图
## 算法
  颜色模式:YUV444
  压缩算法:DCT变换
  编码方法:行程编码、霍夫曼编码
# 算法原理及实现
## 数据分块
  将320x240图像数据划分为1200个8x8的数据块。
### 原因
  JPEG是以每8x8个点为一个单元进行处理的,即将一个单元做完格式转换、DCT变换、量化、编码等全部处理后,再操作下一个单元。所以需要将图像进行分块。
### 实现
  按从左到右、从上到下的顺序从原数据中取出8x8的数据,依次存放在64长度的数组中。
```C
for(m = 0; m < 8; m++)
for(n = 0; n < 8; n++)
temp[m*8+n] = image[(i*8+m)*240+j*8+n];
```
  对全图进行8x8的分块处理,暂时左上角部分的8x8块为后面的处理作准备。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图11分块结果.png)
## 颜色模式转换
  将RGB565模式的原图像转换为YUV444模式。RGB565模式由Red(红)、Green(绿)、Blue(蓝)三个分量按5:6:5共16bit组成,YUV444模式由Y(亮度)、U(色度)、V(饱和度)三个分量按8:8:8共24bit组成。
###原因
  研究发现,人眼对亮度变换的敏感度要比对色彩(色度和饱和度)变换的敏感度高出很多。利用这个特性,我们可以对YUV模式的图像进行亮度权重较高、色度权重较低的采样,得到数据量更小的图片,同时损失的精度又不易被人眼察觉。YUV常用的采样比例有4:1:1和4:2:2等,下图为YUV411采样。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图1格式转换.png)
  RGB模式显然不具备YUV这种采样优势,所以需要对其进行转换。本设计中因为在4:4:4采样时的压缩率已达成设计要求,所以暂时采用YUV444来保证最好的图像质量。
### 实现
  因原始图像为RGB565格式,所以需先将其分离为8位的red、green、blue分量,C语言实现方法如下。
```C
red = (rgb565 & 0xF800) >> 8;
green = (rgb565 & 0x07E0) >> 3;
blue = (rgb565 & 0x001F) << 3;
```
  又因后续的DCT变换所能处理的数值范围为-127~+127,所以需将RGB转YUV得的到数值均减去128。
```C
Y = 0.299f*red + 0.587f*green + 0.114f*blue - 128;
U = -0.1687f*red - 0.3313f*green + 0.5f*blue;
V = 0.5f*red - 0.418f*green - 0.0813f*blue;
```
  对图像的第一个8x8数据块进行上述格式转换,得到其亮度、色度、饱和度三层数据,这里只选取其亮度层作为展示,后续的一系列处理均以此8x8亮度层数据为例。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图2格式转换结果.png)
## DCT变换
  将8x8的图像数据变换为8x8的频域系数矩阵。
### 原因
  DCT变换是JEPG图像压缩的核心部分。在频域中,由于大多数图像的高频分量比较小,相应的图像高频分量的DCT系数经常接近于0,再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高频成分的失真不太敏感,所以,可以考虑将这一些高频成分予以抛弃,从而降低需要传输的数据量。这样一来,传送DCT变换系数的所需要的编码长度要远远小于传送图像像素的编码长度。到达接收端之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可接受的,而且对这种微小的改变是不敏感的。
### 实现
  DCT变换公式:
  DCT变换相关代码见本项目的User\JPEG\hnit_jpeg.c\"jpeg_dct2"
  图像信号通过DCT被分解为直流成分和一些从低频到高频的各种余弦成分。而DCT系数只表示了该种成分所占原图像信号的份额大小。例如,U=0,V=0时的F(0,0)是原来的64个数据的均值,相当于直流分量,也有人称之为DC系数或者直流系数。随着U,V的增加,相另外的63个系数则代表了水平空间频率和垂直空间频率分量(高频分量)的大小,多半是一些接近于0的正负浮点数,我们称之为交流系数AC。DCT变换后的8x8的系数矩阵中,低频分量集中在矩阵的左上角。高频成分则集中在右下角。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图3DCT变换结果.png)
## 量化
  将8x8的频域系数矩阵按照量化表进行量化。
### 原因
  原因有三点。其一,去掉部分高频分量,因为我们要保留低频分量,适当去掉高频分量来压缩数据;其二,减小数据的数值大小,在压缩方面,小数值的数据一般比大数值的更有优势;其三,化浮点型为整型,方便后面的编码处理。
### 实现
  首先我们需要一张8x8的量化矩阵,以下是常用的一张根据心理阀制作的量化表,当然也可以按照需要自行编写。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图9量化表.png)
  将频域系数矩阵点除量化矩阵,即可完成量化,结果如下,可见出现了大量的0,尤其是右下方的高频部分。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图4量化结果.png)
## 排序
### 说明
  将量化后的数据按照Z形重新排序,一般称其为Zigzag排序。
### 原因
  在上一步得到的频域数组中的数据是按从左到右、从上到下的顺序存放的。但频域中从低频到高频的顺序应为下表所示,最低频位于左上角,最高频位于右上角。所以需对其进行重排序,使其内存存储顺序和频率增长顺序一致。这样做会使有效的数据更为紧凑,尾部出现更多的连零。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图10排序表.png)
### 实现
  因为排序的数据量较小,只有64个,所以出于实现难度和运行速度的考虑,设计中使用查表法完成Zigzag排序。
```C
for(i = 0; i < 64; i++)
temp[zigzag_code[i]] = data[i];
```
  代码中的zigzag_code为上图排序表,排序后的结果如下,频率增长方向已用不同深度的灰色标出。可见,原数据从第一个数据'-8'开始到最后一个不为0的数据'1'需要9个长度,已用下划线标出,而排序后则只需要6个长度。
![Alt Text](https://github.com/HuffieWang/JPEG/blob/master/DATA/图5排序结果.png)
## 行程编码
  将排序后的数据进行针对连零的行程编码。
### 原因
  利用该编码方式,可以将包含大量连零的数据块用几个行程数据包来替代。因为Zigzag排序后的数据出现了很多连零,所以用此方法可以很好的压缩数据长度。
### 实现
  每个行程数据包有三个字节,第一个字节为出现“非零数据”前的连零数量,若出现超过15个连零,则用一个额外的包(15,0,0)表示;第二个字节为该“非零数据”的绝对值的二进制位数,例如'-8'的绝对值'8'的二进制"1000"为4位,则该字节的值为4;第三个字节为该“非零数据”的值'-8'。(3,4,-8)代表本次查询到的非零数据为'-8',是4位的,前面有3个连零,还原后为'0','0','0','-8'。
  行程编码的相关代码见本项目的User\JPEG\hnit_jpeg.c\"jpeg_rle"。
  编码后的结果如下所示,共得到4组有效数据包和1组编码结束数据包,已用不同深度的灰色标出。
![Alt Text](https://gi
没有合适的资源?快使用搜索试试~ 我知道了~
JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip
共276个文件
h:49个
o:47个
d:47个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 157 浏览量
2024-03-15
00:15:29
上传
评论 1
收藏 12.44MB ZIP 举报
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip
资源推荐
资源详情
资源评论
收起资源包目录
JPEG图像压缩算法源码+项目说明(在STM32平台的实现,包含主要算法).zip (276个子文件)
HNIT-STM32.uvguix.Administrator 167KB
HNIT-STM32.uvgui.Administrator 139KB
STM32-HNIT.axf 621KB
STM32-HNIT_sct.Bak 464B
keilkilll.bat 372B
stm32f4xx_tim.c 119KB
stm32f4xx_rtc.c 98KB
stm32f4xx_rcc.c 94KB
hnit_lcd.c 80KB
stm32f4xx_adc.c 66KB
stm32f4xx_flash.c 60KB
stm32f4xx_can.c 57KB
stm32f4xx_usart.c 55KB
stm32f4xx_cryp_aes.c 55KB
stm32f4xx_fmc.c 54KB
stm32f4xx_i2c.c 52KB
stm32f4xx_dma.c 50KB
stm32f4xx_spi.c 50KB
system_stm32f4xx.c 46KB
stm32f4xx_sai.c 44KB
stm32f4xx_fsmc.c 40KB
stm32f4xx_ltdc.c 38KB
stm32f4xx_sdio.c 37KB
stm32f4xx_pwr.c 36KB
stm32f4xx_cryp.c 34KB
stm32f4xx_dma2d.c 26KB
stm32f4xx_dac.c 25KB
stm32f4xx_hash.c 25KB
stm32f4xx_gpio.c 24KB
hnit_jpeg.c 23KB
stm32f4xx_dcmi.c 18KB
stm32f4xx_rng.c 13KB
misc.c 11KB
stm32f4xx_cryp_tdes.c 10KB
stm32f4xx_wwdg.c 10KB
stm32f4xx_exti.c 9KB
stm32f4xx_cryp_des.c 9KB
stm32f4xx_hash_sha1.c 9KB
stm32f4xx_syscfg.c 9KB
stm32f4xx_hash_md5.c 9KB
stm32f4xx_iwdg.c 9KB
hnit_sram.c 8KB
stm32f4xx_dbgmcu.c 6KB
stm32f4xx_flash_ramfunc.c 5KB
stm32_delay.c 4KB
stm32f4xx_it.c 4KB
stm32_usart.c 4KB
stm32f4xx_crc.c 3KB
hnit_led.c 1KB
hnit_key.c 1KB
main.c 1KB
stm32_sys.c 779B
hnit_lcd.crf 462KB
hnit_jpeg.crf 460KB
stm32f4xx_tim.crf 443KB
main.crf 441KB
stm32f4xx_rtc.crf 441KB
stm32f4xx_ltdc.crf 438KB
stm32f4xx_cryp_aes.crf 436KB
stm32f4xx_sai.crf 435KB
stm32f4xx_rcc.crf 434KB
stm32f4xx_dma2d.crf 433KB
stm32f4xx_can.crf 432KB
stm32f4xx_adc.crf 430KB
stm32f4xx_flash.crf 430KB
stm32f4xx_dma.crf 430KB
stm32_usart.crf 430KB
stm32f4xx_i2c.crf 429KB
stm32f4xx_fsmc.crf 429KB
stm32f4xx_cryp.crf 428KB
stm32f4xx_usart.crf 428KB
stm32f4xx_spi.crf 428KB
hnit_sram.crf 428KB
stm32f4xx_sdio.crf 427KB
stm32f4xx_pwr.crf 426KB
stm32f4xx_dac.crf 426KB
stm32f4xx_hash.crf 425KB
stm32f4xx_gpio.crf 425KB
stm32f4xx_dcmi.crf 425KB
stm32_delay.crf 425KB
stm32f4xx_cryp_tdes.crf 425KB
stm32f4xx_hash_sha1.crf 425KB
stm32f4xx_hash_md5.crf 425KB
system_stm32f4xx.crf 425KB
stm32f4xx_cryp_des.crf 425KB
hnit_led.crf 424KB
hnit_key.crf 424KB
stm32f4xx_exti.crf 424KB
stm32_sys.crf 424KB
stm32f4xx_syscfg.crf 424KB
stm32f4xx_wwdg.crf 424KB
misc.crf 423KB
stm32f4xx_rng.crf 423KB
stm32f4xx_iwdg.crf 423KB
stm32f4xx_flash_ramfunc.crf 423KB
stm32f4xx_dbgmcu.crf 423KB
stm32f4xx_crc.crf 423KB
stm32f4xx_it.crf 423KB
stm32f4xx_flash_ramfunc.d 2KB
hnit_jpeg.d 2KB
共 276 条
- 1
- 2
- 3
资源评论
土豆片片
- 粉丝: 1529
- 资源: 5641
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功