1

我有以下矩阵:

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没有帮助。

4

1 回答 1

2

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

当您重新读取值时,其他两个值是有意义的,因为0.01double 形式实际上是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 算法压缩任意数据。

于 2014-08-20T21:19:10.433 回答