信号处理仿真:图像信号处理_(6).图像压缩编码
图像压缩编码引言图像压缩编码是数字图像处理中的一个重要分支其目的是通过减少图像数据的冗余性来降低存储和传输的成本。在通信与信息系统中高效的图像压缩技术可以显著提高数据传输的速度和质量减少带宽的占用同时节省存储空间。本节将详细介绍图像压缩编码的原理和技术包括无损压缩和有损压缩方法并通过具体示例说明如何在实际应用中实现这些技术。无损压缩1. 哈夫曼编码Huffman Coding哈夫曼编码是一种经典的无损压缩技术通过构建最优前缀码来减少数据的存储空间。哈夫曼编码的基本原理是为出现频率高的字符分配较短的编码为出现频率低的字符分配较长的编码。原理频率统计计算每个字符出现的频率。构建哈夫曼树根据频率构建哈夫曼树频率低的节点优先合并。生成编码表从哈夫曼树的根节点到每个叶子节点生成编码表。编码使用生成的编码表对原始数据进行编码。解码使用哈夫曼树对编码数据进行解码。代码示例importheapqimportcollections# 定义哈夫曼树节点classNode:def__init__(self,char,freq):self.charchar self.freqfreq self.leftNoneself.rightNonedef__lt__(self,other):returnself.freqother.freq# 构建哈夫曼树defbuild_huffman_tree(freq):heap[Node(char,freq)forchar,freqinfreq.items()]heapq.heapify(heap)whilelen(heap)1:node1heapq.heappop(heap)node2heapq.heappop(heap)mergedNode(None,node1.freqnode2.freq)merged.leftnode1 merged.rightnode2 heapq.heappush(heap,merged)returnheap[0]# 生成编码表defgenerate_codes(node,prefix,code_dict{}):ifnodeisNone:returnifnode.charisnotNone:code_dict[node.char]prefix generate_codes(node.left,prefix0,code_dict)generate_codes(node.right,prefix1,code_dict)# 编码函数defhuffman_encode(data,code_dict):return.join(code_dict[char]forcharindata)# 解码函数defhuffman_decode(encoded_data,root):noderoot decoded_data[]forbitinencoded_data:ifbit0:nodenode.leftelse:nodenode.rightifnode.charisnotNone:decoded_data.append(node.char)noderootreturn.join(decoded_data)# 示例数据datathis is an example for huffman encoding# 计算频率freqcollections.Counter(data)# 构建哈夫曼树rootbuild_huffman_tree(freq)# 生成编码表code_dict{}generate_codes(root,,code_dict)# 编码encoded_datahuffman_encode(data,code_dict)print(Encoded Data:,encoded_data)# 解码decoded_datahuffman_decode(encoded_data,root)print(Decoded Data:,decoded_data)代码解释定义哈夫曼树节点Node类用于表示哈夫曼树的节点包含字符、频率、左子节点和右子节点。构建哈夫曼树build_huffman_tree函数通过频率构建哈夫曼树使用最小堆heapq来合并频率最低的节点。生成编码表generate_codes函数从根节点遍历哈夫曼树生成每个字符的编码。编码函数huffman_encode函数使用生成的编码表对原始数据进行编码。解码函数huffman_decode函数使用哈夫曼树对编码数据进行解码。2. 算术编码Arithmetic Coding算术编码是一种无损压缩技术通过将数据序列映射到一个区间来实现压缩。与哈夫曼编码相比算术编码可以实现更高的压缩比但计算复杂度更高。原理频率统计计算每个字符出现的频率。初始化区间设置初始区间为[0, 1)。编码根据字符的频率逐步缩小区间生成编码值。解码根据编码值和频率信息逐步恢复原始数据。代码示例classArithmeticCoder:def__init__(self,freq):self.freqfreq self.totalsum(freq.values())self.cum_freqself._compute_cum_freq(freq)self.low,self.high,self.code0.0,1.0,0.0def_compute_cum_freq(self,freq):cum_freq{}cumulative0forchar,finfreq.items():cum_freq[char]cumulative cumulativefreturncum_freqdefencode(self,data):forcharindata:char_lowself.cum_freq[char]/self.total char_high(self.cum_freq[char]self.freq[char])/self.total range_sizeself.high-self.low self.highself.lowrange_size*char_high self.lowself.lowrange_size*char_low self.code(self.lowself.high)/2returnself.codedefdecode(self,code,length):decoded_data[]for_inrange(length):forchar,finself.freq.items():char_lowself.cum_freq[char]/self.total char_high(self.cum_freq[char]f)/self.totalifchar_lowcodechar_high:decoded_data.append(char)self.highchar_high self.lowchar_lowbreakreturn.join(decoded_data)# 示例数据datathis is an example for arithmetic encoding# 计算频率freqcollections.Counter(data)# 算术编码coderArithmeticCoder(freq)encoded_datacoder.encode(data)print(Encoded Data:,encoded_data)# 算术解码decoded_datacoder.decode(encoded_data,len(data))print(Decoded Data:,decoded_data)代码解释初始化区间__init__方法初始化频率、总频率、累计频率、区间低点、高点和编码值。计算累计频率_compute_cum_freq方法计算每个字符的累计频率。编码encode方法根据字符的频率逐步缩小区间生成编码值。解码decode方法根据编码值和频率信息逐步恢复原始数据。有损压缩1. JPEG压缩JPEGJoint Photographic Experts Group压缩是一种广泛使用的有损压缩技术适用于连续色调的自然图像。JPEG压缩通过离散余弦变换DCT和量化来减少图像中的冗余信息。原理分块将图像分成8x8的块。离散余弦变换DCT对每个块进行DCT变换将空间域的图像转换为频率域。量化对DCT系数进行量化减少数据的精度。熵编码对量化后的系数进行熵编码进一步减少数据量。代码示例importnumpyasnpimportcv2# DCT矩阵defdct_matrix(n8):mnp.zeros((n,n))foriinrange(n):forjinrange(n):ifi0:m[i,j]1/np.sqrt(n)else:m[i,j]np.sqrt(2/n)*np.cos((2*j1)*i*np.pi/(2*n))returnm# 量化矩阵quantization_matrixnp.array([[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]])# DCT变换defdct_2d(block):mdct_matrix()returnnp.dot(np.dot(m,block),m.T)# 逆DCT变换defidct_2d(block):mdct_matrix()returnnp.dot(np.dot(m.T,block),m)# 量化defquantize(block,quantization_matrix):returnnp.round(block/quantization_matrix)# 逆量化defdequantize(block,quantization_matrix):returnblock*quantization_matrix# 读取图像imagecv2.imread(example.jpg,cv2.IMREAD_GRAYSCALE)height,widthimage.shape# 分块blocks[image[i:i8,j:j8]foriinrange(0,height,8)forjinrange(0,width,8)]# DCT变换和量化dct_blocks[dct_2d(block)forblockinblocks]quantized_blocks[quantize(block,quantization_matrix)forblockindct_blocks]# 逆量化和逆DCT变换dequantized_blocks[dequantize(block,quantization_matrix)forblockinquantized_blocks]idct_blocks[idct_2d(block)forblockindequantized_blocks]# 重构图像reconstructed_imagenp.zeros_like(image)fork,blockinenumerate(idct_blocks):i,j(k//(width//8))*8,(k%(width//8))*8reconstructed_image[i:i8,j:j8]block# 显示原始和重构图像cv2.imshow(Original Image,image)cv2.imshow(Reconstructed Image,np.clip(reconstructed_image,0,255).astype(np.uint8))cv2.waitKey(0)cv2.destroyAllWindows()代码解释DCT矩阵dct_matrix函数生成8x8的DCT矩阵。量化矩阵quantization_matrix是JPEG标准中的量化矩阵。DCT变换dct_2d函数对8x8块进行二维DCT变换。逆DCT变换idct_2d函数对8x8块进行二维逆DCT变换。量化quantize函数对DCT系数进行量化。逆量化dequantize函数对量化后的系数进行逆量化。读取图像cv2.imread函数读取图像转换为灰度图像。分块将图像分成8x8的块。DCT变换和量化对每个块进行DCT变换和量化。逆量化和逆DCT变换对量化后的块进行逆量化和逆DCT变换重构图像。显示图像使用cv2.imshow函数显示原始和重构图像。2. 小波变换压缩小波变换是一种多分辨率分析方法可以有效地捕获图像的局部特征。小波变换压缩通过将图像转换为小波系数然后对系数进行量化和编码来实现压缩。原理分块将图像分成多个块。小波变换对每个块进行小波变换生成小波系数。量化对小波系数进行量化减少数据的精度。熵编码对量化后的系数进行熵编码进一步减少数据量。代码示例importpywtimportnumpyasnpimportcv2# 量化函数defquantize_wavelet_coeffs(coeffs,quantization_factor):return[np.round(c/quantization_factor)forcincoeffs]# 逆量化函数defdequantize_wavelet_coeffs(coeffs,quantization_factor):return[c*quantization_factorforcincoeffs]# 读取图像imagecv2.imread(example.jpg,cv2.IMREAD_GRAYSCALE)# 小波变换coeffspywt.wavedec2(image,haar)# 量化quantization_factor10quantized_coeffsquantize_wavelet_coeffs(coeffs,quantization_factor)# 逆量化dequantized_coeffsdequantize_wavelet_coeffs(quantized_coeffs,quantization_factor)# 逆小波变换reconstructed_imagepywt.waverec2(dequantized_coeffs,haar)# 显示原始和重构图像cv2.imshow(Original Image,image)cv2.imshow(Reconstructed Image,np.clip(reconstructed_image,0,255).astype(np.uint8))cv2.waitKey(0)cv2.destroyAllWindows()代码解释读取图像cv2.imread函数读取图像转换为灰度图像。小波变换pywt.wavedec2函数对图像进行二维小波变换生成小波系数。量化quantize_wavelet_coeffs函数对小波系数进行量化。逆量化dequantize_wavelet_coeffs函数对量化后的系数进行逆量化。逆小波变换pywt.waverec2函数对逆量化后的系数进行逆小波变换重构图像。显示图像使用cv2.imshow函数显示原始和重构图像。总结图像压缩编码是提高数据传输效率和节省存储空间的重要技术。无损压缩方法如哈夫曼编码和算术编码可以在不损失信息的前提下减少数据量。有损压缩方法如JPEG压缩和小波变换压缩通过牺牲部分信息来实现更高的压缩比。通过上述示例您可以了解这些技术的基本原理和实现方法并在实际应用中进行尝试和优化。

相关新闻

信号处理仿真:图像信号处理_(4).图像压缩与编码

信号处理仿真:图像信号处理_(4).图像压缩与编码

图像压缩与编码 引言 图像压缩与编码是图像信号处理中的重要技术之一,其目的是减少图像数据的存储空间或传输带宽,同时保持图像的视觉质量。在数字通信系统中,图像压缩编码技术不仅可以提高数据传输的效率,还可以降低存储成本。…

2026/7/8 17:29:07 阅读更多 →
信号处理仿真:图像信号处理_(2).数字图像的获取与显示

信号处理仿真:图像信号处理_(2).数字图像的获取与显示

数字图像的获取与显示 在上一节中,我们讨论了信号处理仿真的基本概念和应用领域。接下来,我们将深入探讨数字图像的获取与显示,这是图像信号处理中的基础环节。数字图像的获取和显示不仅涉及到硬件设备的使用,还包括图像数据的存储…

2026/7/5 13:43:46 阅读更多 →
android (RK3588) 查看所有声卡

android (RK3588) 查看所有声卡

[TOC](android (RK3588) 查看所有声卡) 最近发现了一个超好用的IDE!!免费体验全球最强旗舰模型 Claude Opus 4.5,会自己找网络接口,会调试跨系统 bug,还会操作桌面应用、Excel、浏览器。还能读懂复杂代码库、拆解多系…

2026/7/5 14:42:49 阅读更多 →

最新新闻

3分钟上手Seraphine:英雄联盟智能助手如何让你的排位赛更轻松

3分钟上手Seraphine:英雄联盟智能助手如何让你的排位赛更轻松

3分钟上手Seraphine:英雄联盟智能助手如何让你的排位赛更轻松 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 还在为英雄联盟排位赛中的各种繁琐操作烦恼吗?Seraphine是一款基于官方LC…

2026/7/8 17:28:35 阅读更多 →
Unity中文路径内存泄漏排查:软连接与命令行参数实战指南

Unity中文路径内存泄漏排查:软连接与命令行参数实战指南

1. 项目概述:当Unity遇上中文路径如果你是一名Unity开发者,尤其是在国内团队工作,那么“项目路径包含中文”这个场景大概率是绕不开的。从美术资源、策划文档到项目根目录,中文命名带来的直观性和管理便利性不言而喻。然而&#x…

2026/7/8 17:26:32 阅读更多 →
Unity 2021 LTS安装XDreamer避坑指南:解决菜单栏消失与兼容性问题

Unity 2021 LTS安装XDreamer避坑指南:解决菜单栏消失与兼容性问题

1. 项目概述:为什么XDreamer在Unity 2021 LTS上安装是个“技术活”? 如果你正在用Unity 2021 LTS版本做项目,并且想引入XDreamer这个强大的扩展工具来提升开发效率,那你很可能已经踩过坑,或者正站在坑边犹豫。这个标题…

2026/7/8 17:26:32 阅读更多 →
Unity NavMeshModifierVolume 核心误区与实战配置指南

Unity NavMeshModifierVolume 核心误区与实战配置指南

1. 项目概述:为什么你的NavMesh总是不听话?在Unity里做寻路,尤其是涉及到复杂地形、多层结构或者需要精细控制AI移动区域的时候,NavMesh系统绝对是绕不开的核心。而NavMeshModifierVolume,这个看似简单的绿色方盒子&am…

2026/7/8 17:26:32 阅读更多 →
九大 AI 毕业论文写作工具横向测评,2026 毕业生学术创作优选指南

九大 AI 毕业论文写作工具横向测评,2026 毕业生学术创作优选指南

一、绪论:高校论文写作刚需爆发,AI 工具成毕业刚需 当下各大院校对毕业论文的审核标准持续收紧,重复率查重、AIGC 痕迹检测、院校专属格式规范三重门槛叠加,本科、硕博生独自完成论文的难度直线上升。传统写作模式中,…

2026/7/8 17:26:32 阅读更多 →
性能测试并发问题排查实战:从指标分析到数据库锁竞争优化

性能测试并发问题排查实战:从指标分析到数据库锁竞争优化

1. 项目概述:从“吐血”到“上高速”的性能测试实战心法 看到这个标题,估计不少做性能测试的朋友会心一笑。“吐血整理”四个字,道尽了我们在定位并发问题时的辛酸——面对响应时间飙升、TPS上不去、系统莫名卡死的诡异现象,谁没经…

2026/7/8 17:24:31 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻