做一个网站需要多少钱大概费用,永兴网站建设报价,南坪做网站,国内知名软件开发公司文章目录 一#xff1a;图像编码基本理论#xff08;1#xff09;图像压缩的必要性#xff08;2#xff09;图像压缩的可能性A#xff1a;编码冗余B#xff1a;像素间冗余C#xff1a;心理视觉冗余 #xff08;3#xff09;图像压缩方法分类A#xff1a;基于编码前后… 文章目录 一图像编码基本理论1图像压缩的必要性2图像压缩的可能性A编码冗余B像素间冗余C心理视觉冗余 3图像压缩方法分类A基于编码前后的信息保持程度的分类B基于编码方法的分类C其他方法 4图像编码术语 二图像的无损压缩编码1无损编码理论2霍夫曼编码A概述B程序 3算数编码A概述B程序 4LZW编码A概述B程序 一图像编码基本理论
图像编码一种将数字图像转换为压缩表示形式的过程。它的目标是减少图像数据的存储空间并在传输或存储时减少带宽和存储需求、主要分为两类
无损压缩尽可能地保留原始图像的所有信息以实现无失真的压缩。其中最常见的算法之一是无损JPEGJPEG-LS编码它使用类似于有损JPEG的离散余弦变换但保留了所有细节有损压缩通过牺牲一些细节和图像质量来实现更高的压缩比。最常见的有损压缩算法之一是JPEGJoint Photographic Experts Group编码。JPEG使用离散余弦变换DCT将图像分成不同频率的频谱并根据人眼对颜色和亮度的感知特性来降低高频细节。这样可以大幅减少图像的体积但会引入一定程度的失真
1图像压缩的必要性
图像压缩的必要性
存储空间的节省原始数字图像通常占据大量的存储空间。通过压缩图像可以有效地减少其所占用的存储空间。例如一个高分辨率的彩色图像可能需要几百兆字节的存储空间而通过压缩可以将其缩小到几十兆字节或更少传输效率的提高对于需要通过网络进行传输的图像较大的图像文件会占用更多的带宽和传输时间。通过压缩图像可以显著降低传输所需的带宽和时间成本。这对于在线图片分享、视频流媒体等应用非常重要资源的优化利用在诸如移动设备、无人机、监控摄像头等资源受限的环境中压缩图像可以减少处理和传输所需的计算资源和能源消耗。这有助于延长设备的电池寿命、提高处理速度并降低硬件成本
例如一部90分钟的彩色电影每秒放映24帧。把它数字化每帧512´512像素每像素的R、G、B三分量分别占8b则总比特数为 90 × 60 × 24 × 3 × 512 × 512 × 8 b i t 97 , 200 M B 90×60×24×3×512×512×8bit97,200MB 90×60×24×3×512×512×8bit97,200MB
因此传输带宽、速度、存储器容量的限制使得对图象数据进行压缩显得非常必要 2图像压缩的可能性
A编码冗余
编码冗余称为信息熵冗余。如果一个图像的灰度级编码使用了多于实际需要的编码符号就称该图像包含了编码冗余\
例如下图如果用8bit表示该图像的像素那么则认为该图像存在编码冗余。因为该图像的像素只有两个灰度级用1bit即可表示 在大多数图像中图像像素的灰度值分布是不均匀的因此若对图像的灰度值直接进行自然二进制编码等长编码则会对有最大和最小概率可能性的值分配相同比特数而产生了编码冗余 用自然二进制编码时没有考虑像素灰度值出现的概率。只有按概率分配编码长度才是最精减的编码方法。也即灰度级出现概率大的用短码表示出现概率小的灰度级用长码表示则有可能使编码总长度下降 B像素间冗余
像素间冗余对应图像目标的像素之间一般具有相关性。因此图像中一般存在与像素间相关性直接联系着的数据冗余——像素相关冗余。主要有
空间冗余邻近像素灰度分布的相关性很强频间冗余多谱段图像中各谱段图像对应像素之间灰度相关性很强时间冗余序列图像帧间画面对应像素灰度的相关性很强结构冗余有些图像存在较强的纹理结构或自相似性如墙纸、草席等图像知识冗余有些图像中包含与某些先验知识相关的信息 C心理视觉冗余
心理视觉冗余人的眼睛并不是对所有信息都有相同的敏感度有些信息在通常的视觉感觉过程中与另外一些信息相比来说并不那么重要这些信息可以认为是心理视觉冗余的
3图像压缩方法分类
A基于编码前后的信息保持程度的分类
信息保持编码无损编码 在编解码过程中保证图像信息不丢失通常压缩比一般不超过3:1保真度编码有损编码 丢掉一些人眼不敏感的次要信息在一定保真度准则下最大限度地压缩图像特征提取 在图像识别、分析和分类等技术中只对感兴趣部分特征进行编码压缩
B基于编码方法的分类
熵编码 基于信息统计特性的编码技术。如行程编码、Huffman编码和算术编码等预测编码 常用的有差分脉冲编码调制和运 动估计与补偿预测编码法变换编码 将空间域图像经过正交变换映射 到另一变换域上再采用适当的量化和熵编码来有效压缩图像。通常采用的变换离散傅里叶变换DFT、离散余弦变换DCT和离散小波变换DWT等
C其他方法 早起编码方法如混合编码、矢量量化、LZW算法等 一些新的编码方法 人工神经元网络ANN的压缩编码分形编码小波编码基于模型的压缩编码基于对象的压缩编码…
4图像编码术语
压缩比 r n L ˉ 压缩前每像素所占平均比特数目 压后每像素所占平均比特数目 r\frac{n}{\bar{L}}\frac{\text { 压缩前每像素所占平均比特数目 }}{\text { 压后每像素所占平均比特数目 }} rLˉn 压后每像素所占平均比特数目 压缩前每像素所占平均比特数目
图像熵
令 p ( d i ) p(d_{i}) p(di)为数字图像第 i i i个灰度级 d i d_{i} di的出现概率 H − ∑ i 1 m p ( d i ) log 2 p ( d i ) ( p p i x e l / b i t ) H-\sum_{i1}^{m} p\left(d_{i}\right) \log _{2} p\left(d_{i}\right)\left(p^{p i x e l} /{ }_{b i t}\right) H−i1∑mp(di)log2p(di)(ppixel/bit)
平均码字长度 L ˉ \bar{L} Lˉ
令 L i L_{i} Li为数字图像第 i i i个灰度级 d i d_{i} di的编码长度 L ˉ ∑ i 1 m L i p ( d i ) ( pixel / bit ) \bar{L}\sum_{i1}^{m} L_{i} p\left(d_{i}\right) \quad(\text { pixel } / \text { bit }) Lˉi1∑mLip(di)( pixel / bit )
编码效率 η H L ˉ × 100 % \eta\frac{H}{\bar{L}} \times 100 \% ηLˉH×100%
二图像的无损压缩编码
1无损编码理论
Shannon无失真编码定理也称为香农编码定理Shannon’s source coding theorem是信息论中的一个重要定理由克劳德·香农Claude Shannon在1948年提出。该定理表明在一给定离散概率分布下对于任意平均码长小于熵的正数值存在一种编码方式可以使得编码后的数据长度趋近于此平均码长并且解码时不会引入任何失真。简而言之香农无失真编码定理表明对于具有确定概率分布的离散信源我们可以设计一种编码方案使得编码后的数据尽可能地紧凑接近其熵值。在解码时我们可以完全恢复原始的消息没有任何信息的丢失或失真。这个定理在信息压缩领域具有重要的应用价值它提供了一种理论基础和算法思路用于有效地压缩数据并在解压缩时还原原始信息。同时无失真编码定理也为其他信息论相关的研究和应用提供了重要参考和指导
如下假设有一原始符号序列为 a 1 a 4 a 4 a 1 a 2 a 1 a 1 a 4 a 1 a 3 a 2 a 1 a 4 a 1 a 1 a_{1}a_{4}a_{4}a_{1}a_{2}a_{1}a_{1}a_{4}a_{1}a_{3}a_{2}a_{1}a_{4}a_{1}a_{1} a1a4a4a1a2a1a1a4a1a3a2a1a4a1a1
若采用等长编码等长编码是将所有符号当作等概率事件处理的 若采用变字长编码变字长编码是每个符号的码字长度随字符出现概率而变化 a 1 a_{1} a18次 a 2 a_{2} a22次 a 3 a_{3} a31次 a 4 a_{4} a44次 2霍夫曼编码
A概述
此部分内容不在详细介绍请移步(王道408考研数据结构)第五章树-第四节3哈夫曼树基本概念、构造和哈夫曼编码
B程序
实现图像的霍夫曼编码 matlab
clc;clear;
%load image
Image[7 2 5 1 4 7 5 0; 5 7 7 7 7 6 7 7; 2 7 7 5 7 7 5 4; 5 2 4 7 3 2 7 5;1 7 6 5 7 6 7 2; 3 3 7 3 5 7 4 1; 7 2 1 7 3 3 7 5; 0 3 7 5 7 2 7 4];
[h w]size(Image); totalpixelnumh*w;
lenmax(Image(:))1;
for graynum1:lengray(graynum,1)graynum-1;%将图像的灰度级统计在数组gray第一列
end
%将各个灰度出现的频数统计在数组histgram中
for graynum1:lenhistgram(graynum)0; gray(graynum,2)0;for i1:wfor j1:hif gray(graynum,1)Image(j,i)histgram(graynum)histgram(graynum)1;endendendhistgram(graynum)histgram(graynum)/totalpixelnum;
end
histbackuphistgram;
%找到概率序列中最小的两个相加依次增加数组hist的维数存放每一次的概率和同时将原概率屏蔽置为1.1
%最小概率的序号存放在tree第一列中次小的放在第二列
sum0; treeindex1;
while(1)if sum1.0break;else[sum1,p1]min(histgram(1:len)); histgram(p1)1.1;[sum2,p2]min(histgram(1:len)); histgram(p2)1.1;sumsum1sum2; lenlen1; histgram(len)sum;tree(treeindex,1)p1; tree(treeindex,2)p2;treeindextreeindex1; end
end
%数组gray第一列表示灰度值第二列表示编码码值第三列表示编码的位数
for k1:treeindex-1ik; codevalue1;if or(tree(k,1)graynum,tree(k,2)graynum)if tree(k,1)graynumgray(tree(k,1),2)gray(tree(k,1),2)codevalue;codelength1;while(itreeindex-1)codevaluecodevalue*2;for ji:treeindex-1if tree(j,1)igraynumgray(tree(k,1),2)gray(tree(k,1),2)codevalue;codelengthcodelength1;ij; break;elseif tree(j,2)igraynumcodelengthcodelength1;ij; break;endendendgray(tree(k,1),3)codelength;endik; codevalue1;if tree(k,2)graynumcodelength1;while(itreeindex-1)codevaluecodevalue*2;for ji:treeindex-1if tree(j,1)igraynumgray(tree(k,2),2)gray(tree(k,2),2)codevalue;codelengthcodelength1;ij; break;elseif tree(j,2)igraynumcodelengthcodelength1;ij; break;endendendgray(tree(k,2),3)codelength;endend
end
%把gray数组的第二三列即灰度的编码值及编码位数输出
for k1:graynumA{k}dec2bin(gray(k,2),gray(k,3));
end
disp(编码);
disp(A);
python
import numpy as np
import matplotlib.pyplot as plt# Load image
Image np.array([[7, 2, 5, 1, 4, 7, 5, 0],[5, 7, 7, 7, 7, 6, 7, 7],[2, 7, 7, 5, 7, 7, 5, 4],[5, 2, 4, 7, 3, 2, 7, 5],[1, 7, 6, 5, 7, 6, 7, 2],[3, 3, 7, 3, 5, 7, 4, 1],[7, 2, 1, 7, 3, 3, 7, 5],[0, 3, 7, 5, 7, 2, 7, 4]])h, w Image.shape
totalpixelnum h * w
len np.max(Image) 1gray np.zeros((len, 3))
gray[:, 0] np.arange(len)histgram np.zeros(len)
for graynum in range(len):histgram[graynum] np.sum(Image graynum) / totalpixelnumhistbackup histgram.copy()sum_val 0
treeindex 0
tree np.zeros((len, 2))
while True:if sum_val 1.0:breakelse:p1 np.argmin(histgram)histgram[p1] 1.1p2 np.argmin(histgram)histgram[p2] 1.1sum_val histbackup[p1] histbackup[p2]len 1histgram[len-1] sum_valtree[treeindex, 0] p1tree[treeindex, 1] p2treeindex 1gray[:, 1] np.arange(len)for k in range(treeindex):i kcodevalue 1if tree[k, 0] graynum or tree[k, 1] graynum:if tree[k, 0] graynum:gray[int(tree[k, 0]), 1] codevaluecodelength 1while i treeindex - 1:codevalue * 2for j in range(i, treeindex - 1):if tree[j, 0] i graynum:gray[int(tree[k, 0]), 1] codevaluecodelength 1i jbreakelif tree[j, 1] i graynum:codelength 1i jbreakgray[int(tree[k, 0]), 2] codelengthi kcodevalue 1if tree[k, 1] graynum:codelength 1while i treeindex - 1:codevalue * 2for j in range(i, treeindex - 1):if tree[j, 0] i graynum:gray[int(tree[k, 1]), 1] codevaluecodelength 1i jbreakelif tree[j, 1] i graynum:codelength 1i jbreakgray[int(tree[k, 1]), 2] codelength# Convert gray code to binary strings
A [bin(int(x[1]))[2:].zfill(int(x[2])) for x in gray[:len]]# Display the encoding
print(编码:)
for i, code in enumerate(A):print(f{i}: {code})# Plotting the image
plt.imshow(Image, cmapgray)
plt.axis(off)
plt.show()
3算数编码
A概述
算数编码是一种无失真的数据压缩技术用于将源数据序列转换为更紧凑的编码序列。与传统的固定长度编码方法如霍夫曼编码不同算术编码使用一个区间来表示整个源数据序列而不是将每个符号映射到固定长度的编码字。算术编码的基本思想是利用符号出现的概率分布来为每个符号分配一个对应的区间并根据输入的符号序列逐步缩小区间范围。最终所生成的区间内的任意一个数值都可以表示原始数据序列的唯一编码。基本步骤如下
初始化给定待编码的符号序列和对应的概率分布。创建初始区间根据符号的概率分布为每个符号分配一个区间。编码根据每个输入符号按照其在当前区间的长度比例更新区间的上界和下界。重标定根据区间的更新进行重标定以保证精度和避免溢出。输出当所有符号编码完成后输出最终区间中的任意一个编码值作为压缩结果
算术编码的优势在于可以实现接近熵编码效率的压缩比尤其适用于符号概率分布不均匀、频率较高的数据。然而算术编码的实现相对复杂且计算量大同时对解码过程中的精度要求较高。需要注意的是由于算术编码涉及到浮点数运算和精度处理因此在实际应用中可能存在一定的误差累积和舍入误差问题。这些问题可以通过使用更高精度的数值表示或采用其他技巧来缓解。总之算术编码是一种强大的数据压缩技术能够提供较高的压缩比尤其适用于无损压缩和对压缩比要求较高的场景
B程序
matlab
%算术编码
clc;clear;
%load image
%Image[7 2 5 1 4 7 5 0;5 7 7 7 7 6 7 7;2 7 7 5 7 7 5 4;5 2 4 7 3 2 7 5;
% 1 7 6 5 7 6 7 2;3 3 7 3 5 7 4 1;7 2 1 7 3 3 7 5;0 3 7 5 7 2 7 4];
Image[4 1 3 1 2];
[h w col]size(Image); pixelnumh*w;
graynummax(Image(:))1;
for i1:graynumgray(i)i-1;
end
histgramzeros(1,graynum);
for i1:wfor j1:hpixeluint8(Image(j,i)1);histgram(pixel)histgram(pixel)1; end
end
histgramhistgram/pixelnum;%将各个灰度出现的频数统计在数组histgram中
disp(灰度级);disp(num2str(gray));
disp(概率);disp(num2str(histgram))
disp(每一行字符串及其左右编码)
for j1:hstrnum2str(Image(j,:)); left0; right0;intervallen1; lenlength(str);for i1:lenif str(i) continue;endmstr2num(str(i))1; pl0; pr0;for j1:m-1plplhistgram(j);endfor j1:mprprhistgram(j);endrightleftintervallen*pr; leftleftintervallen*pl;%间隔区间起始和终止端点 intervallenright-left; % 间隔区间宽度 end%输入图像信息数据disp(str); %编码输出间隔区间disp(num2str(left)); disp(num2str(right)) temp0; a1;while(1)left2*left;right2*right;if floor(left)~floor(right)break;endtemptempfloor(left)*2^(-a);aa1;leftleft-floor(left);rightright-floor(right);endtemptemp2^(-a);lla;%寻找最后区间内的最短二进制小数和所需的比特位数disp(num2str(temp)); disp(ll); %算术编码的编码码字输出disp(算术编码的编码码字输出); %yyDEC2bin(temp,ll);%简单的将10进制转化为N为2进制小数for ii 1: lltemp1temp*2;yy(ii)floor(temp1);temptemp1-floor(temp1);enddisp(num2str(yy));
end
python
import numpy as np# 算术编码
# load image
Image np.array([[4, 1, 3, 1, 2]])
[h, w] Image.shape
pixelnum h * w
graynum np.max(Image) 1gray np.arange(graynum)histgram np.zeros(graynum)
for i in range(w):for j in range(h):pixel Image[j, i]histgram[pixel] 1histgram / pixelnum
print(灰度级:, gray)
print(概率:, histgram)print(每一行字符串及其左右编码)
for j in range(h):str_ [str(x) for x in Image[j]]left 0right 0intervallen 1len_ len(str_)for i in range(len_):if str_[i] :continuem int(str_[i]) 1pl np.sum(histgram[:m-1])pr np.sum(histgram[:m])right left intervallen * prleft left intervallen * plintervallen right - leftprint(.join(str_))print(left, right)temp 0a 1while True:left * 2right * 2if int(left) ! int(right):breaktemp int(left) * pow(2, -a)a 1left - int(left)right - int(right)temp pow(2, -a)ll aprint(temp, ll)print(算术编码的编码码字输出)yy []for ii in range(ll):temp1 temp * 2yy.append(int(temp1))temp temp1 - int(temp1)print(yy)
4LZW编码
A概述
**LZW编码是一种用于数据压缩的无损压缩算法它可以将输入数据中的重复模式编码为更短的代码从而减小数据的存储空间。LZW编码最初由Terry Welch在1984年提出广泛应用于图像、音频和文本等领域。LZW编码的基本思想是利用字典来对输入数据进行编码。初始时字典中包含所有可能的单个字符作为键以及相应的编号作为值。然后从输入数据的开头开始逐步扫描输入数据并检查当前扫描的序列是否已经在字典中存在。如果已存在则继续向后扫描并将当前序列与下一个字符拼接直到找到一个新的序列。此时将该新序列的编号输出并将这个新序列添加到字典中以供后续的编码使用。整个过程持续进行直到扫描完整个输入数据。LZW编码的关键是维护一个动态更新的字典。在编码过程中字典不断增长并根据输入数据中的模式进行更新。因此相同的输入数据可以使用不同长度的编码表示具有较高的压缩比
B程序
matlab
clc;clear;
Image[30 30 30 30;110 110 110 110;30 30 30 30;110 110 110 110];
[h w col]size(Image);
pixelnumh*w; graynum256;
%graynummax(Image(:))1;
if col1 graystringreshape(Image,1,pixelnum);%灰度图像从二维变为一维信号for tablenum1:graynumtable{tablenum}num2str(tablenum-1);endlenlength(graystring); lzwstring(1)graynum;R; stringnum1;for i1:lenSnum2str(graystring(i));RS[R,S]; flagismember(RS,table);if flagRRS;elselzwstring(stringnum)find(cellfun((x)strcmp(x,R),table))-1;stringnumstringnum1; tablenumtablenum1;table{tablenum}RS; RS;endendlzwstring(stringnum)find(cellfun((x)strcmp(x,R),table))-1;disp(LZW码串 )disp(lzwstring)
endpython
import numpy as npImage np.array([[30, 30, 30, 30],[110, 110, 110, 110],[30, 30, 30, 30],[110, 110, 110, 110]])[h, w] Image.shape
pixelnum h * w
graynum 256if Image.ndim 2:graystring Image.T.flatten()table {str(i): i for i in range(graynum)}lzwstring [graynum]R stringnum 1for i in range(len(graystring)):S str(graystring[i])RS R Sif RS in table:R RSelse:lzwstring.append(table[R])stringnum 1tablenum len(table)table[RS] tablenumR Slzwstring.append(table[R])print(LZW码串)print(lzwstring)