![](/img/trans.png)
[英]Issues with MATLAB: JPEG2000 compression scheme using wavelet toolbox
[英]Quantization Error in Lossless JPEG2000 (Matlab)
我有以下矩阵:
A = [0.01 0.02; 1.02 1.80];
我想使用JPEG 2000进行压缩,然后恢复数据。 我在MATLAB中使用了imwrite
和imread
,如下所示:
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.