当前位置: 首页 > news >正文

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

图像压缩编码

引言

图像压缩编码是数字图像处理中的一个重要分支,其目的是通过减少图像数据的冗余性来降低存储和传输的成本。在通信与信息系统中,高效的图像压缩技术可以显著提高数据传输的速度和质量,减少带宽的占用,同时节省存储空间。本节将详细介绍图像压缩编码的原理和技术,包括无损压缩和有损压缩方法,并通过具体示例说明如何在实际应用中实现这些技术。

无损压缩

1. 哈夫曼编码(Huffman Coding)

哈夫曼编码是一种经典的无损压缩技术,通过构建最优前缀码来减少数据的存储空间。哈夫曼编码的基本原理是为出现频率高的字符分配较短的编码,为出现频率低的字符分配较长的编码。

原理
  1. 频率统计:计算每个字符出现的频率。
  2. 构建哈夫曼树:根据频率构建哈夫曼树,频率低的节点优先合并。
  3. 生成编码表:从哈夫曼树的根节点到每个叶子节点生成编码表。
  4. 编码:使用生成的编码表对原始数据进行编码。
  5. 解码:使用哈夫曼树对编码数据进行解码。
代码示例
importheapqimportcollections# 定义哈夫曼树节点classNode:def__init__(self,char,freq):self.char=char self.freq=freq self.left=Noneself.right=Nonedef__lt__(self,other):returnself.freq<other.freq# 构建哈夫曼树defbuild_huffman_tree(freq):heap=[Node(char,freq)forchar,freqinfreq.items()]heapq.heapify(heap)whilelen(heap)>1:node1=heapq.heappop(heap)node2=heapq.heappop(heap)merged=Node(None,node1.freq+node2.freq)merged.left=node1 merged.right=node2 heapq.heappush(heap,merged)returnheap[0]# 生成编码表defgenerate_codes(node,prefix="",code_dict={}):ifnodeisNone:returnifnode.charisnotNone:code_dict[node.char]=prefix generate_codes(node.left,prefix+"0",code_dict)generate_codes(node.right,prefix+"1",code_dict)# 编码函数defhuffman_encode(data,code_dict):return''.join(code_dict[char]forcharindata)# 解码函数defhuffman_decode(encoded_data,root):node=root decoded_data=[]forbitinencoded_data:ifbit=='0':node=node.leftelse:node=node.rightifnode.charisnotNone:decoded_data.append(node.char)node=rootreturn''.join(decoded_data)# 示例数据data="this is an example for huffman encoding"# 计算频率freq=collections.Counter(data)# 构建哈夫曼树root=build_huffman_tree(freq)# 生成编码表code_dict={}generate_codes(root,"",code_dict)# 编码encoded_data=huffman_encode(data,code_dict)print("Encoded Data:",encoded_data)# 解码decoded_data=huffman_decode(encoded_data,root)print("Decoded Data:",decoded_data)
代码解释
  1. 定义哈夫曼树节点Node类用于表示哈夫曼树的节点,包含字符、频率、左子节点和右子节点。
  2. 构建哈夫曼树build_huffman_tree函数通过频率构建哈夫曼树,使用最小堆(heapq)来合并频率最低的节点。
  3. 生成编码表generate_codes函数从根节点遍历哈夫曼树,生成每个字符的编码。
  4. 编码函数huffman_encode函数使用生成的编码表对原始数据进行编码。
  5. 解码函数huffman_decode函数使用哈夫曼树对编码数据进行解码。

2. 算术编码(Arithmetic Coding)

算术编码是一种无损压缩技术,通过将数据序列映射到一个区间来实现压缩。与哈夫曼编码相比,算术编码可以实现更高的压缩比,但计算复杂度更高。

原理
  1. 频率统计:计算每个字符出现的频率。
  2. 初始化区间:设置初始区间为[0, 1)。
  3. 编码:根据字符的频率逐步缩小区间,生成编码值。
  4. 解码:根据编码值和频率信息逐步恢复原始数据。
代码示例
classArithmeticCoder:def__init__(self,freq):self.freq=freq self.total=sum(freq.values())self.cum_freq=self._compute_cum_freq(freq)self.low,self.high,self.code=0.0,1.0,0.0def_compute_cum_freq(self,freq):cum_freq={}cumulative=0forchar,finfreq.items():cum_freq[char]=cumulative cumulative+=freturncum_freqdefencode(self,data):forcharindata:char_low=self.cum_freq[char]/self.total char_high=(self.cum_freq[char]+self.freq[char])/self.total range_size=self.high-self.low self.high=self.low+range_size*char_high self.low=self.low+range_size*char_low self.code=(self.low+self.high)/2returnself.codedefdecode(self,code,length):decoded_data=[]for_inrange(length):forchar,finself.freq.items():char_low=self.cum_freq[char]/self.total char_high=(self.cum_freq[char]+f)/self.totalifchar_low<=code<char_high:decoded_data.append(char)self.high=char_high self.low=char_lowbreakreturn''.join(decoded_data)# 示例数据data="this is an example for arithmetic encoding"# 计算频率freq=collections.Counter(data)# 算术编码coder=ArithmeticCoder(freq)encoded_data=coder.encode(data)print("Encoded Data:",encoded_data)# 算术解码decoded_data=coder.decode(encoded_data,len(data))print("Decoded Data:",decoded_data)
代码解释
  1. 初始化区间__init__方法初始化频率、总频率、累计频率、区间低点、高点和编码值。
  2. 计算累计频率_compute_cum_freq方法计算每个字符的累计频率。
  3. 编码encode方法根据字符的频率逐步缩小区间,生成编码值。
  4. 解码decode方法根据编码值和频率信息逐步恢复原始数据。

有损压缩

1. JPEG压缩

JPEG(Joint Photographic Experts Group)压缩是一种广泛使用的有损压缩技术,适用于连续色调的自然图像。JPEG压缩通过离散余弦变换(DCT)和量化来减少图像中的冗余信息。

原理
  1. 分块:将图像分成8x8的块。
  2. 离散余弦变换(DCT):对每个块进行DCT变换,将空间域的图像转换为频率域。
  3. 量化:对DCT系数进行量化,减少数据的精度。
  4. 熵编码:对量化后的系数进行熵编码,进一步减少数据量。
代码示例
importnumpyasnpimportcv2# DCT矩阵defdct_matrix(n=8):m=np.zeros((n,n))foriinrange(n):forjinrange(n):ifi==0:m[i,j]=1/np.sqrt(n)else:m[i,j]=np.sqrt(2/n)*np.cos((2*j+1)*i*np.pi/(2*n))returnm# 量化矩阵quantization_matrix=np.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):m=dct_matrix()returnnp.dot(np.dot(m,block),m.T)# 逆DCT变换defidct_2d(block):m=dct_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# 读取图像image=cv2.imread('example.jpg',cv2.IMREAD_GRAYSCALE)height,width=image.shape# 分块blocks=[image[i:i+8,j:j+8]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_image=np.zeros_like(image)fork,blockinenumerate(idct_blocks):i,j=(k//(width//8))*8,(k%(width//8))*8reconstructed_image[i:i+8,j:j+8]=block# 显示原始和重构图像cv2.imshow('Original Image',image)cv2.imshow('Reconstructed Image',np.clip(reconstructed_image,0,255).astype(np.uint8))cv2.waitKey(0)cv2.destroyAllWindows()
代码解释
  1. DCT矩阵dct_matrix函数生成8x8的DCT矩阵。
  2. 量化矩阵quantization_matrix是JPEG标准中的量化矩阵。
  3. DCT变换dct_2d函数对8x8块进行二维DCT变换。
  4. 逆DCT变换idct_2d函数对8x8块进行二维逆DCT变换。
  5. 量化quantize函数对DCT系数进行量化。
  6. 逆量化dequantize函数对量化后的系数进行逆量化。
  7. 读取图像cv2.imread函数读取图像,转换为灰度图像。
  8. 分块:将图像分成8x8的块。
  9. DCT变换和量化:对每个块进行DCT变换和量化。
  10. 逆量化和逆DCT变换:对量化后的块进行逆量化和逆DCT变换,重构图像。
  11. 显示图像:使用cv2.imshow函数显示原始和重构图像。

2. 小波变换压缩

小波变换是一种多分辨率分析方法,可以有效地捕获图像的局部特征。小波变换压缩通过将图像转换为小波系数,然后对系数进行量化和编码来实现压缩。

原理
  1. 分块:将图像分成多个块。
  2. 小波变换:对每个块进行小波变换,生成小波系数。
  3. 量化:对小波系数进行量化,减少数据的精度。
  4. 熵编码:对量化后的系数进行熵编码,进一步减少数据量。
代码示例
importpywtimportnumpyasnpimportcv2# 量化函数defquantize_wavelet_coeffs(coeffs,quantization_factor):return[np.round(c/quantization_factor)forcincoeffs]# 逆量化函数defdequantize_wavelet_coeffs(coeffs,quantization_factor):return[c*quantization_factorforcincoeffs]# 读取图像image=cv2.imread('example.jpg',cv2.IMREAD_GRAYSCALE)# 小波变换coeffs=pywt.wavedec2(image,'haar')# 量化quantization_factor=10quantized_coeffs=quantize_wavelet_coeffs(coeffs,quantization_factor)# 逆量化dequantized_coeffs=dequantize_wavelet_coeffs(quantized_coeffs,quantization_factor)# 逆小波变换reconstructed_image=pywt.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()
代码解释
  1. 读取图像cv2.imread函数读取图像,转换为灰度图像。
  2. 小波变换pywt.wavedec2函数对图像进行二维小波变换,生成小波系数。
  3. 量化quantize_wavelet_coeffs函数对小波系数进行量化。
  4. 逆量化dequantize_wavelet_coeffs函数对量化后的系数进行逆量化。
  5. 逆小波变换pywt.waverec2函数对逆量化后的系数进行逆小波变换,重构图像。
  6. 显示图像:使用cv2.imshow函数显示原始和重构图像。

总结

图像压缩编码是提高数据传输效率和节省存储空间的重要技术。无损压缩方法如哈夫曼编码和算术编码可以在不损失信息的前提下减少数据量。有损压缩方法如JPEG压缩和小波变换压缩通过牺牲部分信息来实现更高的压缩比。通过上述示例,您可以了解这些技术的基本原理和实现方法,并在实际应用中进行尝试和优化。

http://www.jsqmd.com/news/304603/

相关文章:

  • 信号处理仿真:图像信号处理_(2).数字图像的获取与显示
  • 大数据存储解决方案:HBase、Cassandra与MongoDB对比
  • android (RK3588) 查看所有声卡
  • 智能体设计模式三
  • 2026年制粒机厂家推荐排行榜:沸腾/摇摆/旋转/湿法/干法/快速整粒机,螺杆挤压/陶瓷喷雾造粒机,球形抛丸机,多功能制粒包衣机专业解析
  • 泰林注薛氏湿热论歌诀
  • 智能体设计模式二
  • WEB前端3道练习题的运用
  • 【蓝海掘金】Shopee/Lazada 卖家必看!泰语、阿语图片全是乱码?揭秘 AI 如何搞定“复杂小语种”翻译
  • AI Skills:前端新的效率神器!
  • 【全托管卖家必看】Temu/TikTok 图片审核总不过?揭秘 AI 如何一键“清洗”中文牛皮癣,100% 通过率!【全托管卖家必看】Temu/TikTok 图片审核总不过?揭秘 AI 如何一键“清洗
  • 一次 scrollIntoView 在 Android 企微中失效的踩坑实录
  • n8n文件写入权限问题的深度诊断与解决方案:一次完整的技术排查实录
  • 【课程设计/毕业设计】基于SpringBoot的公园景区旅游小程序设计与实现基于springboot的公园综合服务系统设计与实现小程序【附源码、数据库、万字文档】
  • Java计算机毕设之基于springboot的公园健身参观浏览综合服务系统设计与实现小程序(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的机票预订系统(源码+文档+远程调试,全bao定制等)
  • 震撼来袭!AI应用架构师的智能金融系统设计创新趋势
  • NOI2026 做题记录 三
  • 智能体设计模式一
  • 2026年 智能高定品牌推荐榜单:整屋/全屋/家具/家居/一站式/实木智能高定,匠心融合科技与美学的未来生活解决方案
  • 风雪守通信 初心护畅通—临沂郯城联通抢修团队风雪中的坚守
  • 【开题答辩全过程】以 基于j2ee的问卷调查系统为例,包含答辩的问题和答案
  • 十件实事映初心,暖心工程聚合力 ——临沂联通2025年员工关爱行动绘就幸福画卷
  • 【开题答辩全过程】以 基于微信小程序的社区养老积分银行系统的设计为例,包含答辩的问题和答案
  • vllm设置参数 llm调用显存使用1gb
  • 学习笔记——ADC(模数转换器)技术
  • 【开题答辩全过程】以 基于SpringBoot的智能书城推荐系统的设计与实现为例,包含答辩的问题和答案
  • 传输层协议UDP和TCP
  • 50. 用户友好的提示系统:架构师如何实现实时反馈?
  • 2026激光切管机十大品牌:口碑实力诚信正规优秀厂商推荐