我在保存到磁盘时尝试了各种方法进行数据压缩numpy arrays.
这些一维阵列包含一定采样率的采样数据(可以使用麦克风录制声音,或使用任何传感器进行任何其他测量):数据基本上是连续的(在数学意义上;当然,采样后它现在是离散数据) .
我试过HDF5(h5py):
f.create_dataset("myarray1", myarray, compression="gzip", compression_opts=9)
但这很慢,压缩比不是我们所能期望的最好.
我也尝试过
numpy.savez_compressed()
但是再一次,它可能不是这种数据的最佳压缩算法(如前所述).
对于numpy array这样的数据,你会选择什么来获得更好的压缩比?
(我考虑过无损FLAC(最初是为音频而设计),但是有一种简单的方法可以在numpy数据上应用这样的算法吗?)
我正在寻找一个专门用于压缩Jpegs而不改变图像的库.我找到了PackJpeg,但它没有提供任何源代码,你也不允许在商业上使用它.
任何人都可以解释数据压缩的算术编码与实现细节?我已经通过互联网浏览并找到了标记纳尔逊的帖子,但是在尝试了很长时间之后,实施的技术确实不清楚.
马克纳尔逊关于算术编码的解释可以在
http://marknelson.us/1991/02/01/arithmetic-coding-statistical-modeling-data-compression/
我试图无损压缩图像,为了利用规律性,我想将图像从RGB转换为Y'CbCr.(我和RGB和Y'CbCr的含义的确切细节在这里并不重要; RGB数据由三个字节组成,我有三个字节来存储结果.)
转换过程本身非常简单,但有一个问题:尽管转换在数学上是可逆的,但实际上会出现舍入误差.当然,这些错误很小,几乎无法察觉,但它确实意味着该过程不再是无损的.
我的问题是:是否存在转换,将三个八位整数(表示红色,绿色和蓝色分量)转换为另外三个八位整数(表示类似于Y'CbCr的颜色空间,其中两个组件仅稍微改变相对于位置,或至少小于RGB颜色空间),并且可以在不丢失信息的情况下进行反转?
我希望我的程序能够使用zlib,lzma,lzo和bzip2压缩算法.
是否有适用于C的压缩库,可以简化多种算法(如libmcrypt支持多种加密模式和算法)?
期待这样的事情:
struct compressor c;
universal_compressor_init(&c, "lzma", 7 /* compression level */);
universal_compressor_compress(&c, inputbuf, inputsize, outputbuf, &outputsize);
universal_compressor_save_state(&c, statebuf, &statesize);
注意:它不是关于zip/rar/7z/tar/cpio和其他存档格式,而是关于压缩原始缓冲区.考虑压缩网络协议或随机访问压缩块设备(如cloop).
背景:我在C++上有一个通用LZSS后端的实现(可在这里找到.我在这个版本中使用的匹配算法非常简单,因为它最初是为了相对古老的硬件压缩相对较小的文件(最多64kB)(特别是,Mega Drive/Sega Genesis,其中64kB是整个主RAM).
然而,有些文件需要很长时间来压缩我的实现,大约几分钟.原因有两个:天真匹配算法占用大部分时间,但这种情况特别是因为我从文件构造压缩图以实现最佳压缩.在分析器上查看,大部分时间用于寻找匹配,甚至使得到的图形的二次大小相形见绌.
一段时间以来,我一直在研究几种潜在的替代品; 引起我注意的是使用多层后缀树的字典符号灵活解析.多层部分很重要,因为我感兴趣的LZSS的一个变体使用可变大小编码(位置,长度).
我当前的实现允许滑动窗口中的匹配与前瞻缓冲区重叠,以便输入:
aaaaaaaaaaaaaaaa
可以直接编码为
(0,'a')(1,0,15)
代替
(0,'a')(1,0,1)(1,0,2)(1,0,4)(1,0,8)
这里,(0,'a')表示将字符'a'编码为文字,而(1,n,m)表示'从位置n'复制m个字符.
问题:说了这么多,这就是我的问题:我在后缀树上找到的每一个资源似乎都暗示他们无法处理重叠的情况,而只允许你找到非重叠的匹配.当涉及后缀树时,研究论文,书籍甚至一些实现给出了压缩示例而没有重叠,好像它们是完美的压缩(我会链接到其中一些,但我的声誉不允许它).有些人甚至提到在描述基本压缩方案时重叠可能很有用,但在讨论后缀树时,这个问题很奇怪.
由于无论如何都需要扩充后缀树以存储偏移量信息,这似乎是在查找匹配时可以检查的属性 - 您将过滤掉在前瞻缓冲区中开始的任何匹配.构造/更新树的方式意味着如果边缘将您带到与前瞻开始的匹配相对应的节点,则返回前一个节点,因为任何其他后代也将在前瞻中缓冲.
我的方法是错误还是不正确?是否有LZ77/LZSS的实现或讨论,后缀树提到匹配重叠前瞻缓冲区?
有谁知道无损压缩算法,它产生无头输出?例如,不要存储用于压缩它的霍夫曼树?我不谈论硬编码的霍夫曼树,但我想知道是否有任何算法可以压缩和解压缩输入而不在其输出中存储一些元数据.或者这在理论上是不可能的?
我正在开发一个游戏引擎,它是Quake 2的松散后裔,添加了一些像脚本效果的东西(允许服务器向客户端详细指定特殊效果,而不是只有有限数量的硬编码效果,客户端能够这是对网络效率的灵活性的权衡.
我遇到了一个有趣的障碍.请参阅,最大数据包大小为2800字节,每个客户端每帧只能有一个数据包.
这是一个做"火花"效果的剧本(可能对子弹撞击火花,电击等有好处) http://pastebin.com/m7acdf519(如果你不明白它,不要出汗;这是我制作的自定义语法,与我提出的问题无关.)
我已尽一切可能缩小该脚本的大小.我甚至将变量名称缩减为单个字母.但结果恰好是405个字节.这意味着每帧最多可以容纳6个.我还想到了一些服务器端的更改,可以将其另外更改为12,并且协议更改可能会节省另外6个.虽然节省会因您使用的脚本而异.
然而,在那些387个字节中,我估计在效果的多次使用之间只有41个是唯一的.换句话说,这是压缩的主要候选者.
事实上,R1Q2(具有扩展网络协议的向后兼容Quake 2引擎)具有Zlib压缩代码.我可以解除这些代码,或至少密切关注它作为参考.
但Zlib一定是这里的最佳选择吗?我能想到至少一种替代方案,LZMA,并且可能会有更多.
要求:
Zlib看起来不错,但有什么更好的吗?请记住,这些代码都没有被合并,因此有足够的实验空间.
谢谢,-Max
编辑:感谢那些建议将脚本编译成字节码的人.我应该明白这一点 - 是的,我这样做.如果你愿意,你可以在我的网站上浏览相关的源代码,虽然它仍然没有"漂亮".
这是服务器端代码:
Lua组件:http://meliaserlow.dyndns.tv: 8000/alienarena/lua_source/lua/ scriptedfx.lua
 
C组件:http://meliaserlow.dyndns.tv :8000/alienarena/lua_source /game/g_scriptedfx.c
 
对于我发布的特定示例脚本,这将获得一个低至405字节的1172字节源 - 仍然不够小.(请记住,我希望尽可能多地将这些内容放入2800字节!)
EDIT2:无法保证任何给定的数据包都会到达.每个数据包应该包含"世界状态",而不依赖于先前数据包中传达的信息.通常,这些脚本将用于传达"眼睛糖果".如果没有空间,它会从数据包中删除,这没什么大不了的.但是,如果太多的东西掉落,事情开始在视觉上看起来很奇怪,这是不可取的.
是否有人可以告诉我如何lossless在java中使用压缩来编写'jpeg'文件?
我使用下面的代码读取字节来编辑字节
WritableRaster raster = image.getRaster();
DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer();
我需要再次将字节写为'jpeg'文件而不压缩lossy.
我正在尝试使用算术编码器对-256 <-> 255(即9位数据由short表示)范围内的有符号值进行编码,但是我发现算术编码的现有实现(例如dlib和rANS)通常会读取字符串形式,并将数据视为8位。
这种技术的问题在于,以字符串形式对有符号数据(如3所示)进行拆分会破坏基础直方图(如4所示)。我相信这种分裂也可能会降低压缩率(但我可能是错的)。
我通过用8位和16位数据实现霍夫曼编码来检验我的假设,发现我是对的,这可能是由于霍夫曼依赖使用概率来制作树所致。
我的问题是:如何对符号进行编码/建模(不能包含在常规的8位容器中),以便可以使用传统的算术压缩器实现轻松压缩生成的符号,而不会影响压缩率。
签名直方图:

分割直方图:

compression ×5
algorithm ×3
c++ ×2
encoding ×2
jpeg ×2
arrays ×1
c ×1
color-space ×1
entropy ×1
java ×1
lossless ×1
lz77 ×1
networking ×1
numpy ×1
python ×1
quake ×1
rgb ×1
suffix-tree ×1