Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compression 串行化足部压力图的最佳无损压缩技术_Compression_Sparse Matrix_Image Compression_Run Length Encoding - Fatal编程技术网

Compression 串行化足部压力图的最佳无损压缩技术

Compression 串行化足部压力图的最佳无损压缩技术,compression,sparse-matrix,image-compression,run-length-encoding,Compression,Sparse Matrix,Image Compression,Run Length Encoding,我正在研究人类脚的压力感应,我需要通过串行通信实时传输帧 典型帧如下所示,由平坦背景和非平坦数据组成: 传输速度目前是一个瓶颈,这是由串行.发送命令造成的微控制器开销造成的,因此工程师正在使用压缩图像,由于背景平坦,连续,这似乎很好,但我们希望进一步压缩图像 我尝试了“坐标列表”编码格式(Listwhereval>0),但大小非常相似,以至于RLE不会产生显著差异 在对此进行一些研究时,人们说“不要重新发明轮子,对于任何类型的图像都有很多经过测试的压缩算法”,因此我想知道下面显示的图像类型的最

我正在研究人类脚的压力感应,我需要通过串行通信实时传输帧

典型帧如下所示,由平坦背景和非平坦数据组成:

传输速度目前是一个瓶颈,这是由
串行.发送
命令造成的微控制器开销造成的,因此工程师正在使用压缩图像,由于背景平坦,连续,这似乎很好,但我们希望进一步压缩图像

我尝试了“坐标列表”编码格式(
List
where
val
>0),但大小非常相似,以至于RLE不会产生显著差异

在对此进行一些研究时,人们说“不要重新发明轮子,对于任何类型的图像都有很多经过测试的压缩算法”,因此我想知道下面显示的图像类型的最佳压缩算法是什么,考虑到:

  • 压缩性能(因为它将由微控制器执行)
  • 大小-因为它是通过串行发送的,这是当前的瓶颈(sic)
  • 另一种方法是使用“稀疏矩阵”概念(而不是“图像压缩”概念),它看起来像是,或CSR,我不太了解如何实现和如何正确序列化,更不用说它与图像压缩技术相比会如何

    更新: 我用我用来创建图像的数据创建了一个。这些是压缩方法的结果(每个条目一个字节):

    • 普通:(
      [n行,n列,*数据]
      ):2290字节
    • 坐标列表:(
      [*(i,j,val)]
      ):936字节
    • 运行长度编码:(
      [*(行长度,rle对)]
      ):846字节
    • 列表列表:690字节
    • 列表的压缩列表:(参见Gist)498字节
    提出的算法 下面是一个可能的算法,它只使用简单的操作[1],内存占用少(没有双关语)

    它似乎工作得相当好,但当然,它应该在几个不同的数据集上进行测试,以便更准确地了解其效率

  • 将矩阵划分为4x4像素的13x11块

  • 对于每个区块:

    • 如果块为空,则发出位“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