手机号关联QQ号查询工具技术指南

核心内容摘要

OpenDataLab MinerU是否兼容ONNX?跨框架部署可行性分析
89C51单片机汽车尾灯设计

农业系统如何集成编辑器的Word解析控件?

图像压缩编码引言图像压缩编码是数字图像处理中的一个重要分支其目的是通过减少图像数据的冗余性来降低存储和传输的成本。

在通信与信息系统中高效的图像压缩技术可以显著提高数据传输的速度和质量减少带宽的占用同时节省存储空间。

本节将详细介绍图像压缩编码的原理和技术包括无损压缩和有损压缩方法并通过具体示例说明如何在实际应用中实现这些技术。

无损压缩

哈夫曼编码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,node

freqnode

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函数使用哈夫曼树对编码数据进行解码。

算术编码Arithmetic Coding算术编码是一种无损压缩技术通过将数据序列映射到一个区间来实现压缩。

与哈夫曼编码相比算术编码可以实现更高的压缩比但计算复杂度更高。

原理频率统计计算每个字符出现的频率。

初始化区间设置初始区间为[0,

编码根据字符的频率逐步缩小区间生成编码值。

解码根据编码值和频率信息逐步恢复原始数据。

代码示例classArithmeticCoder:def__init__(self,freq):self.freqfreq self.totalsum(freq.values())self.cum_freqself._compute_cum_freq(freq)self.low,self.high,self.code

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方法根据编码值和频率信息逐步恢复原始数据。

有损压缩

JPEG压缩JPEGJoint Photographic Experts Group压缩是一种广泛使用的有损压缩技术适用于连续色调的自然图像。

JPEG压缩通过离散余弦变换DCT和量化来减少图像中的冗余信息。

原理分块将图像分成8x8的块。

离散余弦变换DCT对每个块进行DCT变换将空间域的图像转换为频率域。

量化对DCT系数进行量化减少数据的精度。

熵编码对量化后的系数进行熵编码进一步减少数据量。

代码示例importnumpyasnpimportcv2# DCT矩阵defdct_matrix(n

: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*j

*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# 读取图像imagecv

imread(example.jpg,cv

IMREAD_GRAYSCALE)height,widthimage.shape# 分块blocks[image[i:i8,j:j8]foriinrange(0,height,

forjinrange(0,width,

]# 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,(k%(width//

)*8reconstructed_image[i:i8,j:j8]block# 显示原始和重构图像cv

imshow(Original Image,image)cv

imshow(Reconstructed Image,np.clip(reconstructed_image,0,

.astype(np.uint

)cv

waitKey(

cv

destroyAllWindows()代码解释DCT矩阵dct_matrix函数生成8x8的DCT矩阵。

量化矩阵quantization_matrix是JPEG标准中的量化矩阵。

DCT变换dct_2d函数对8x8块进行二维DCT变换。

逆DCT变换idct_2d函数对8x8块进行二维逆DCT变换。

量化quantize函数对DCT系数进行量化。

逆量化dequantize函数对量化后的系数进行逆量化。

读取图像cv

imread函数读取图像转换为灰度图像。

分块将图像分成8x8的块。

DCT变换和量化对每个块进行DCT变换和量化。

逆量化和逆DCT变换对量化后的块进行逆量化和逆DCT变换重构图像。

显示图像使用cv

imshow函数显示原始和重构图像。

小波变换压缩小波变换是一种多分辨率分析方法可以有效地捕获图像的局部特征。

小波变换压缩通过将图像转换为小波系数然后对系数进行量化和编码来实现压缩。

原理分块将图像分成多个块。

小波变换对每个块进行小波变换生成小波系数。

量化对小波系数进行量化减少数据的精度。

熵编码对量化后的系数进行熵编码进一步减少数据量。

代码示例importpywtimportnumpyasnpimportcv2# 量化函数defquantize_wavelet_coeffs(coeffs,quantization_factor):return[np.round(c/quantization_factor)forcincoeffs]# 逆量化函数defdequantize_wavelet_coeffs(coeffs,quantization_factor):return[c*quantization_factorforcincoeffs]# 读取图像imagecv

imread(example.jpg,cv

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)# 显示原始和重构图像cv

imshow(Original Image,image)cv

imshow(Reconstructed Image,np.clip(reconstructed_image,0,

.astype(np.uint

)cv

waitKey(

cv

destroyAllWindows()代码解释读取图像cv

imread函数读取图像转换为灰度图像。

小波变换pywt.wavedec2函数对图像进行二维小波变换生成小波系数。

量化quantize_wavelet_coeffs函数对小波系数进行量化。

逆量化dequantize_wavelet_coeffs函数对量化后的系数进行逆量化。

逆小波变换pywt.waverec2函数对逆量化后的系数进行逆小波变换重构图像。

显示图像使用cv

imshow函数显示原始和重构图像。

总结图像压缩编码是提高数据传输效率和节省存储空间的重要技术。

无损压缩方法如哈夫曼编码和算术编码可以在不损失信息的前提下减少数据量。

有损压缩方法如JPEG压缩和小波变换压缩通过牺牲部分信息来实现更高的压缩比。

通过上述示例您可以了解这些技术的基本原理和实现方法并在实际应用中进行尝试和优化。

9.1快手-9.1快手应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123