繁体   English   中英

无损JPEG2000中的量化误差(Matlab)

[英]Quantization Error in Lossless JPEG2000 (Matlab)

我有以下矩阵:

A = [0.01 0.02; 1.02 1.80];

我想使用JPEG 2000进行压缩,然后恢复数据。 我在MATLAB中使用了imwriteimread ,如下所示:

imwrite(A,'newA.jpg','jp2','Mode','lossless');
Ahat = imread('newA.jpg');

MATLAB在uint8给我结果。 将数据转换为double我得到:

Ahat_double = im2double(Ahat)

Ahat_double = 

0.0118    0.0196
1.0000    1.0000

我知道这是因为量化,但是我不知道如何解析它并获取确切的输入数据,这就是无损压缩应该做的。

在一开始将数据转换为uint8并没有帮助。

之所以无法获得正确的结果,是因为A是双精度矩阵。 double精度将图像写入文件时,假定值在[0,1]之间变化。 在矩阵中,您有2个值> 1 当您将其写入文件时,这些值将饱和为1,然后将它们保存到文件中。 实际上,即使在写入之前,强度也会被缩放,以使它们为uint8且在[0,255]之间变化。 当您尝试重新读取值时,它将以强度255或1.0的两倍强度读取。

其它两个值是有意义的,当你回读出的值,如0.01双形式实际上是255*0.01 = 2.55 ,因此倒圆至3和3 / 255 = 0.0118 对于0.02 ,这是255*0.02 = 5.1 ,因此四舍五入为5和5 / 255 - 0.0196

解决此问题的唯一方法是在写入图像之前重新标准化数据,使其符合[0,1] 为了取回原始数据,您必须知道标准化之前的最小值和最大值。 即使执行此操作,图像中也只能编码256个可能的双精度值(假定为灰度),因此您将无法以这种方式捕获所有可能的浮点值。

因此,基本上没有办法解决您的问题,所以您就是SOL

如果要使用JPEG 2000标准对任意数据进行编码,也许应该从MATLAB的File Exchange下载此库 我没有仔细研究它,但是它可以使用JPEG 2000算法压缩任意数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM