利用opencv与python3 JPEG压缩与解压实现

由于内容是从写好的word文件中复制过来,可能排版等会有各种问题,建议直接看github中的pdf另外由于我写这份作业的时候还不熟悉py3,因此实际上由很多可以优化的地方,比如数组强烈建议使用numpy而不是此处的列表github地址:https://github.com/c980129/JPEGJPEG压缩实现(Python3)RGB转YUVJPEG会将彩色图像执行...
摘要由CSDN通过智能技术生成

由于内容是从写好的word文件中复制过来,可能排版等会有各种问题,建议直接看github中的pdf

另外由于我写这份作业的时候还不熟悉py3,因此实际上由很多可以优化的地方,比如数组强烈建议使用numpy而不是此处的列表

github地址:https://github.com/c980129/JPEG

【代码有误,参考前请先参考评论】

JPEG压缩实现(Python3)

  1. RGB转YUV

JPEG会将彩色图像执行YUV或YIQ的颜色空间转换,二次采样JPEG采用4:2:0,所以这里使用YUV420的颜色空间。在JPEG中使用的颜色模型是YCbCr(由YUV调整而来)。对于一个2*2的块,我们会保存4个Y值,1个Cb值(取0行0列的Cb)与1个Cr值(取1行0列的Cr),6个值保存信息,因此Cb与Cr有一定损失。

其中我们用函数rgb2yuv(在RGB2YUV.py)中来实现颜色模型转换与二次采样。并分别用三个二维数组保存采取的Y、U、V值。于是我们能得到三张分别用Y、U、V生成的灰度图(由于U和V损失为原来的1/4,因此其图像的长宽也分别为原来的1/2)(为了减少绝对值将Y值减去128):

  1. 图像边长填充为8的倍数并等分

用DCT.fill(img)函数对二次采样得到的Y、U、V图像分别用0填充知道其矩阵的height和width都是8的倍数,因为DCT函数的参数是一个8*8的矩阵。同样用DCT.split(img)函数将图像以左到右,上到下的顺序分成多个8*8矩阵,并返回这些矩阵连成的数组。

  1. 离散余弦变换

用DCT.FDCT(block)函数对一个8*8矩阵进行二维离散余弦变换,保存得到的矩阵。

  1. 量化

在类Quantization中保存成员变量table0与table1作为亮度和色度的量化表,调用Quantization.quanY(img)与Quantization.quanUV(img)分别用于对Y图像与U、V图像量化。

  • 13
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值