数字图像处理——JPEG图像压缩

article/2025/9/25 0:26:48

 该文章的代码为数字图像的JPEG压缩模型。最后是我得到的结果。

import numpy as np
import matplotlib.pyplot as plt
from skimage import ioDC_Y = {0: '00',1: '010',2: '011',3: '100',4: '101',5: '110',6: '1110',7: '11110',8: '111110',9: '1111110',10: '11111110',11: '111111110'}
AC_Y = {(0, 0): '1010',(0, 1): '00',(0, 2): '01',(0, 3): '100',(0, 4): '1011',(0, 5): '11010',(0, 6): '1111000',(0, 7): '11111000',(0, 8): '1111110110',(0, 9): '1111111110000010',(0, 10): '1111111110000011',(1, 1): '1100',(1, 2): '11011',(1, 3): '1111001',(1, 4): '111110110',(1, 5): '11111110110',(1, 6): '1111111110000100',(1, 7): '1111111110000101',(1, 8): '1111111110000110',(1, 9): '1111111110000111',(1, 10): '1111111110001000',(2, 1): '11100',(2, 2): '11111001',(2, 3): '1111110111',(2, 4): '111111110100',(2, 5): '1111111110001001',(2, 6): '1111111110001010',(2, 7): '1111111110001011',(2, 8): '1111111110001100',(2, 9): '1111111110001101',(2, 10): '1111111110001110',(3, 1): '111010',(3, 2): '111110111',(3, 3): '111111110101',(3, 4): '1111111110001111',(3, 5): '1111111110010000',(3, 6): '1111111110010001',(3, 7): '1111111110010010',(3, 8): '1111111110010011',(3, 9): '1111111110010100',(3, 10): '1111111110010101',(4, 1): '111011',(4, 2): '1111111000',(4, 3): '1111111110010110',(4, 4): '1111111110010111',(4, 5): '1111111110011000',(4, 6): '1111111110011001',(4, 7): '1111111110011010',(4, 8): '1111111110011011',(4, 9): '1111111110011100',(4, 10): '1111111110011101',(5, 1): '1111010',(5, 2): '11111110111',(5, 3): '1111111110011110',(5, 4): '1111111110011111',(5, 5): '1111111110100000',(5, 6): '1111111110100001',(5, 7): '1111111110100010',(5, 8): '1111111110100011',(5, 9): '1111111110100100',(5, 10): '1111111110100101',(6, 1): '1111011',(6, 2): '111111110110',(6, 3): '1111111110100110',(6, 4): '1111111110100111',(6, 5): '1111111110101000',(6, 6): '1111111110101001',(6, 7): '1111111110101010',(6, 8): '1111111110101011',(6, 9): '1111111110101100',(6, 10): '1111111110101101',(7, 1): '11111010',(7, 2): '111111110111',(7, 3): '1111111110101110',(7, 4): '1111111110101111',(7, 5): '1111111110110000',(7, 6): '1111111110110001',(7, 7): '1111111110110010',(7, 8): '1111111110110011',(7, 9): '1111111110110100',(7, 10): '1111111110110101',(8, 1): '111111000',(8, 2): '111111111000000',(8, 3): '1111111110110110',(8, 4): '1111111110110111',(8, 5): '1111111110111000',(8, 6): '1111111110111001',(8, 7): '1111111110111010',(8, 8): '1111111110111011',(8, 9): '1111111110111100',(8, 10): '1111111110111101',(9, 1): '111111001',(9, 2): '1111111110111110',(9, 3): '1111111110111111',(9, 4): '1111111111000000',(9, 5): '1111111111000001',(9, 6): '1111111111000010',(9, 7): '1111111111000011',(9, 8): '1111111111000100',(9, 9): '1111111111000101',(9, 10): '1111111111000110',(10, 1): '111111010',(10, 2): '1111111111000111',(10, 3): '1111111111001000',(10, 4): '1111111111001001',(10, 5): '1111111111001010',(10, 6): '1111111111001011',(10, 7): '1111111111001100',(10, 8): '1111111111001101',(10, 9): '1111111111001110',(10, 10): '1111111111001111',(11, 1): '1111111001',(11, 2): '1111111111010000',(11, 3): '1111111111010001',(11, 4): '1111111111010010',(11, 5): '1111111111010011',(11, 6): '1111111111010100',(11, 7): '1111111111010101',(11, 8): '1111111111010110',(11, 9): '1111111111010111',(11, 10): '1111111111011000',(12, 1): '1111111010',(12, 2): '1111111111011001',(12, 3): '1111111111011010',(12, 4): '1111111111011011',(12, 5): '1111111111011100',(12, 6): '1111111111011101',(12, 7): '1111111111011110',(12, 8): '1111111111011111',(12, 9): '1111111111100000',(12, 10): '1111111111100001',(13, 1): '11111111000',(13, 2): '1111111111100010',(13, 3): '1111111111100011',(13, 4): '1111111111100100',(13, 5): '1111111111100101',(13, 6): '1111111111100110',(13, 7): '1111111111100111',(13, 8): '1111111111101000',(13, 9): '1111111111101001',(13, 10): '1111111111101010',(14, 1): '1111111111101011',(14, 2): '1111111111101100',(14, 3): '1111111111101101',(14, 4): '1111111111101110',(14, 5): '1111111111101111',(14, 6): '1111111111110000',(14, 7): '1111111111110001',(14, 8): '1111111111110010',(14, 9): '1111111111110011',(14, 10): '1111111111110100',(15, 0): '11111111001',(15, 1): '1111111111110101',(15, 2): '1111111111110110',(15, 3): '1111111111110111',(15, 4): '1111111111111000',(15, 5): '1111111111111001',(15, 6): '1111111111111010',(15, 7): '1111111111111011',(15, 8): '1111111111111100',(15, 9): '1111111111111101',(15, 10): '1111111111111110',
}def ZScan( img):Z = []i = j = 0Z.append(img[i][j])while i < 8 and j < 8:if j < 7:j = j + 1else:i = i + 1while j >= 0 and i < 8:Z.append(img[i][j])i = i + 1j = j - 1i = i - 1j = j + 1if i < 7:i = i + 1else:j = j + 1while j < 8 and i >= 0:Z.append(img[i][j])i = i - 1j = j + 1i = i + 1j = j - 1return Zdef RLC( a):temp = []numof0 = 0for num in a:if num == 0:numof0 += 1else:temp.append([numof0, num])numof0 = 0if numof0 != 0:temp.append([0, 0])return tempdef RLE(a):temp = []for s in a:zero = s[0]num = s[1]if num == 0:for i in range(len(temp)):temp.append(0)breakfor i in range(zero):temp.append(0)temp.append(num)return tempdef toB(num):num = int(num)s = bin(abs(num)).replace('0b', '')if num < 0:s2 = ''for c in s:s2 += '0' if c == '1' else '1'return s2else:return sdef VLI( num):if num == 0:return [0, '']s = toB(num)return [len(s), s]def AllCompressY( DC, arr, N):s = ''s += DC_Y[N-DC]  # 需要用当前的DC系数减去上一个DC系数for num in arr:runlength = num[0]value = num[1]temp = VLI(value)while runlength > 15:runlength -= 15s += AC_Y[(15, 0)]s += AC_Y[(runlength, temp[0])]s += temp[1]return sdef main():img = io.imread('lenna.png')# 分8*8大小的块width = len(img[0])height = len(img[1])R_1 = img[:, :, 0]blocks = []for i in range(height//8):for j in range(width//8):temp = [[0 for i in range(8)]for i in range(8)]for r in range(8):for c in range(8):temp[r][c] = R_1[i*8+r][j*8+c]blocks.append(temp)print("原图像第一块8*8大小的数据:", blocks[0])# 离散余弦变换dctA = np.zeros(shape=(8, 8))for i in range(8):c = 0if i == 0:c = np.sqrt(1 / 8)else:c = np.sqrt(2 / 8)for j in range(8):dctA[i, j] = c * np.cos(np.pi * i * (2 * j + 1) / (2 * 8))tlist = []for block in blocks:res = np.dot(dctA, block)res = np.dot(res, np.transpose(dctA))tlist.append(res)print("离散余弦变换后第一块图像数据:", tlist[0])# 量化lq = [[16, 11, 10, 16, 24, 40, 51, 61],[12, 12, 14, 19, 26, 58, 60, 55],[14, 13, 16, 24, 40, 57, 69, 56],[14, 17, 22, 29, 51, 87, 80, 62],[18, 22, 37, 56, 68, 109, 103, 77],[24, 35, 55, 64, 81, 104, 113, 92],[49, 64, 78, 87, 103, 121, 120, 101],[72, 92, 95, 98, 112, 100, 103, 99]]m_list = [[0 for i in range(8)] for i in range(8)]m_list = np.round(tlist[0] / lq)print("量化后图像的数据:", m_list)# Z排Z = []Z = ZScan(m_list)Z_rel = RLC(Z)print("Z排列:", RLE(Z_rel))# 编码print("DC系数:", Z[0])del (Z_rel[0])del (Z_rel[2])print("AC系数:", Z_rel)str = AllCompressY(112, Z_rel, Z[0])print("二进制编码:", str)if __name__ == '__main__':main()

 

 


http://chatgpt.dhexx.cn/article/Et8HIWSp.shtml

相关文章

JPEG图像压缩

转载自&#xff1a; https://blog.csdn.net/shelldon/article/details/54234433 www.thecodeway.com http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ 一、图像分割 JPEG算法的第一步&#xff0c;图像被分割成大小为8X8的小块&#xff0c;这些小块在整个压缩过程中…

JPEG2000图像压缩算法学习

压缩算法——JPEG2000 编解码原理 JPEG2000-Matlab源码实现 JPEG和JPEG2000 JPEG2000和JEPG都是静止图像压缩标准&#xff0c;最大区别是在空间域至频域转换。JPEG是基于离散余弦变换&#xff08;DCT&#xff09;&#xff0c; 而JEPG2000是基于离散小波变换&#xff08;DWT&a…

图像处理(六)——图像压缩

图像压缩模型图像数据中的冗余 三种数据冗余&#xff1a;编码冗余、像素冗余、视觉心理冗余 如果一个图像的灰度级编码&#xff0c;使用了多于实际需要的编码符号&#xff0c;就称该图像包含了编码冗余。 图像压缩中的信息论观点 字典压缩 有…

图片压缩算法

有损算法&#xff1a; JPEG&#xff0c;我们最为常用的算法。他是通过离散余弦变换&#xff0c;对图片质量尽量小的时候进行有损压缩&#xff0c;改算法对高中波特率下效果很好&#xff0c;但是对低波特率下&#xff0c;就会出现方格之类的&#xff0c;比如100多MB的MPEG电影&…

算法设计与分析——图像的压缩

一、基本概念&#xff1a; 像素灰度值为0-255&#xff0c;需要8位二进制数来存储。若一灰度序列为{p1,p2,p3…pn}&#xff0c;pi为第i个像素点的灰度值。则所需的空间为8n。 二、问题提出&#xff1a; 若图像中有一大部分的颜色的相同的或是相近的&#xff0c;能不能有更好的…

JPEG图像压缩算法的python实现

摘要 文章在研究JPEG压缩编码对图像数据压缩的基本原理的基础上&#xff0c;设计了JPEG图像压缩算法程序实现流程&#xff0c;利用 Python语言对程序进行了编写&#xff0c;并实现了对压缩质量进行控制&#xff0c;验证了JPEG压缩编码对图像数据压缩的可行性。 用 JPEG压缩软件…

基于深度学习的图像压缩

近年来&#xff0c;深度学习在计算机视觉领域已经占据主导地位&#xff0c;不论是在图像识别还是超分辨重现上&#xff0c;深度学习已成为图片研究的重要技术&#xff0c;但它们的能力并不仅限于这些任务&#xff1b;现在深度学习技术已进入图片压缩领域。下面就说说神经网络在…

JPEG压缩算法步骤原理

目录 JPEG压缩算法解密 步骤一&#xff1a;图像分割 步骤二&#xff1a;颜色空间转换RGB->YCbCr 步骤三&#xff1a;离散余弦变换 步骤四&#xff1a;数据量化 步骤五&#xff1a;哈弗曼编码 JPEG压缩算法解密 by jinchao 图片压缩有多重要&#xff0c;可能很多人可能…

影像算法解析——JPEG 压缩算法

由于视频是由一帧帧图像构成的&#xff0c;研究视频编码首先先要研究图像编码。这篇文章就详细说一下 JPEG 是如何压缩一个图像的。 先简单介绍一下 JPEG&#xff08;Joint Photographic Experts Group&#xff0c;联合图像专家小组&#xff09;&#xff1a;此团队创立于1986年…

数字图像处理(七)图像压缩-无损编码/压缩算法+matlab

要求&#xff1a; 无损编码/压缩算法&#xff1a; 问题1: 实现行程编码压缩, 肉眼观察压缩效果&#xff0c;并计算原图和压缩以后的尺寸&#xff0c;计算压缩率并比较分析&#xff1b;问题2: 实现哈夫曼压缩, 肉眼观察压缩效果&#xff0c;并计算原图和压缩以后的尺寸&#x…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种&#xff0c;比如PNG&#xff0c;JPEG等等&#xff0c;但当我们把一张图用工具变成各种其他格式时&#xff0c;其在计算机文件系统显示的文件大小各不一样&#xff0c;但是当你打开显示时&#xff0c;从视觉角度…

图像压缩算法简介

理论基础 香农的信息论&#xff0c;在不产生任何失真的前提下&#xff0c;通过合理的编码&#xff0c;对于每个信源符号分配不等长的码字&#xff0c;平均码长可以任意接近于信源的熵。在这个理论框架下产生了几种不同的无失真的信源编码方法&#xff1a;哈夫曼编码&#xff0c…

图像压缩原理

原文网址&#xff1a;http://blog.csdn.net/newchenxf/article/details/51693753 转载请注明出处。 1 图像可压缩的原因 一张原始图像(1920x1080)&#xff0c;如果每个像素32bit表示&#xff08;RGBA&#xff09;&#xff0c;那么&#xff0c;图像需要的内存大小 1920x1080x…

JPEG图像压缩算法详解

转载自 http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ JPEG压缩算法之前已有很多前辈详细讲解过&#xff0c;我就不在这里画蛇添足了&#xff08;主要是我懒。。&#xff09;&#xff0c;转载两篇JPEG压缩算法介绍&#xff0c;拼为一篇。侵删。 JPEG图像压缩算法详解…

图片压缩知识

一、图片压缩算法 有损算法&#xff1a; JPEG&#xff0c;我们最为常用的算法。他是通过离散余弦变换&#xff0c;对图片质量尽量小的时候进行有损压缩&#xff0c;该算法对高中波特率下效果很好&#xff0c;但是对低波特率下&#xff0c;就会出现方格之类的&#xff0c;比如1…

imadjust函数分析一

声明&#xff1a;本文涉及到的行数皆指本文提供的附件imadjust.m的代码中行数 本文只讨论imadjust函数是一种用法&#xff0c;即 J IMADJUST(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA) 处理效果如下图 图像矩阵I要求数据类型uint8、uint16、double、single和int16&…

matlab灰度变换函数imadjust、stretchlim

1、imadjust函数 gimadjust(f,[low_in,high_in],[low_out,high_out],gamma) f为输入灰度图像&#xff0c;将low_in和high_in之间的灰度值映射到low_out到high_out之间 gamma大于1&#xff0c;映射函数下凸&#xff1b;小于1&#xff0c;上凸&#xff1b;gamma默认为1&#x…

Matlab中库函数imadjust()的使用细节

不知道大家有没有使用这个函数时&#xff0c;出现结果异常、过曝的情况我在使用时&#xff0c;发现在官方文档中并未声明的细节。 结合开源的程序源码和实验结果发现该函数对矩阵进行处理时&#xff0c;会对参数指明的处理数据以外的内容进行调整&#xff0c;错误使用会导致图像…

stretchlim matlab,matlab灰阶变换函数imadjust和stretchlim的c++实现

灰阶变换 首先介绍一下灰阶变换&#xff0c;一幅图像数据本身在存储的数据结构上为一个二维的矩阵&#xff0c;即一幅图像为m*n个密密麻麻的像素点构成。 image.png 然后&#xff0c;这些像素点有着一个值&#xff0c;这个值成为灰度值或者亮度值&#xff0c;值的范围为[0,255]…

在OpenCV里实现函数imadjust

imadjust 函数是针对灰度图像进行灰度变换的基本图像。 J = imadjust(f,[low_in; high_in],[low_out; high_out],gamma) 此函数将 f 的灰度值映像到 g 中的新值, 也就是将 low_in 与high in 之间的值映射到 low out 与 high out 之间的值。 low in 以下与 high in 以上的值可…