Compression 串行化足部压力图的最佳无损压缩技术
我正在研究人类脚的压力感应,我需要通过串行通信实时传输帧 典型帧如下所示,由平坦背景和非平坦数据组成: 传输速度目前是一个瓶颈,这是由Compression 串行化足部压力图的最佳无损压缩技术,compression,sparse-matrix,image-compression,run-length-encoding,Compression,Sparse Matrix,Image Compression,Run Length Encoding,我正在研究人类脚的压力感应,我需要通过串行通信实时传输帧 典型帧如下所示,由平坦背景和非平坦数据组成: 传输速度目前是一个瓶颈,这是由串行.发送命令造成的微控制器开销造成的,因此工程师正在使用压缩图像,由于背景平坦,连续,这似乎很好,但我们希望进一步压缩图像 我尝试了“坐标列表”编码格式(Listwhereval>0),但大小非常相似,以至于RLE不会产生显著差异 在对此进行一些研究时,人们说“不要重新发明轮子,对于任何类型的图像都有很多经过测试的压缩算法”,因此我想知道下面显示的图像类型的最
串行.发送
命令造成的微控制器开销造成的,因此工程师正在使用压缩图像,由于背景平坦,连续,这似乎很好,但我们希望进一步压缩图像
我尝试了“坐标列表”编码格式(List
whereval
>0),但大小非常相似,以至于RLE不会产生显著差异
在对此进行一些研究时,人们说“不要重新发明轮子,对于任何类型的图像都有很多经过测试的压缩算法”,因此我想知道下面显示的图像类型的最佳压缩算法是什么,考虑到:
- 普通:(
):2290字节李>[n行,n列,*数据]
- 坐标列表:(
):936字节李>[*(i,j,val)]
- 运行长度编码:(
):846字节李>[*(行长度,rle对)]
- 列表列表:690字节李>
- 列表的压缩列表:(参见Gist)498字节李>
- 如果块为空,则发出位“0”
- 如果块不是空的:
- 发射位“1”
- 在此块中发出非零像素的16位位位掩码
- 发出8位值,表示在此块中找到的最小值(0除外)
- 如果只有一个非零像素,请停在此处[2]
- emit 3位值,表示对该块中的每个非零像素进行编码所需的位数:b=ceil(log2(max+1-min))
- 以N x b位的形式发出非零像素数据
- 矩阵中的许多块是空的
- 足迹边界处的非空块通常有许多空单元(传感器上的“压力”/“无压力”转换是突然的)
[1] 显然没有浮点运算。在算法描述中使用的log2()操作可以很容易地替换为与1、2、4、8、16……的简单比较。。。最多256个 [2] 这是一个小优化,不会经常触发。解码器必须通过计算例如:
(msk&-msk)=msk
来检测位掩码中仅设置了一个位
块编码示例
我们考虑下面的块:
0, 0, 0, 0
12, 0, 0, 0
21, 20, 0, 0
28, 23, 0, 0
非零像素的位掩码为:
0, 0, 0, 0
1, 0, 0, 0 = 0000100011001100
1, 1, 0, 0
1, 1, 0, 0
最小值为12
(00001100),编码每个非零像素所需的位数为5
(101),如log2(28+1-12)~=4.09
最后,让我们对非零像素进行编码:
[ 12, 21, 20, 28, 23 ]
- [ 12, 12, 12, 12, 12 ]
------------------------
= [ 0, 9, 8, 16, 11 ] = [ 00000, 01001, 01000, 10000, 01011 ]
因此,该块的最终编码为:
1 0000100011001100 00001100 101 00000 01001 01000 10000 01011
长度为53位(与未压缩格式中的16*8=128位相反)
然而,最大的增益来自编码为单个位的空块。矩阵中有许多空块这一事实是该算法的一个重要假设
演示
以下是一些在原始数据集上工作的JS演示代码:
var nEmpty,未填充;
函数压缩(矩阵){
变量x,y,数据=“”;
nEmpty=nFilled=0;
对于(y=0;y<44;y+=4){
对于(x=0;x<52;x+=4){
数据+=压缩块(矩阵x,y);
}
}
日志(“空块:+nEmpty”);
控制台日志(“填充块:+N填充);
log(“每个块的平均位:”+(data.length/(nEmpty+nFilled)).toFixed(2));
log(“每个填充块的平均位:”+((data.length-nEmpty)/nFilled.toFixed(2));
log(“最终压缩大小:“+data.length+”位-->”+((data.length+7)>>3)+“字节”);
}
函数压缩块(矩阵,x,y){
var最小值=0x100,最大值=0,msk=0,数据=[],
宽度,v,x0,y0;
对于(y0=0;y0<4;y0++){
对于(x0=0;x0<4;x0++){
if(v=矩阵[y+y0][x+x0]){
msk |=1我将测试JPEG-LS。它是一种非常快速的算法,为多种类型的图像提供最先进的无损压缩结果。特别是,它的预测算法将在平坦区域提供与RLE相当的结果,在脚部区域提供更好的结果
由于要传输多个帧,并且这些帧可能非常相似,因此在应用JPEG-LS之前,可能需要尝试从下一帧中减去一帧(不过,在使用JPEG-LS之前,可能需要将像素重新映射为正整数)
如果您不需要严格的无损压缩(即,如果您可以容忍重建图像中的某些失真),您可以测试接近无损模式,这将限制最大绝对误差intr