Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Image 无损JPEG2000中的量化误差(Matlab)_Image_Matlab_Image Processing_Jpeg2000_Lossless Compression - Fatal编程技术网

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

Image 无损JPEG2000中的量化误差(Matlab),image,matlab,image-processing,jpeg2000,lossless-compression,Image,Matlab,Image Processing,Jpeg2000,Lossless Compression,我有以下矩阵: 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 =

我有以下矩阵:

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
是一个双精度矩阵。当您以
双精度
将图像写入文件时,它假定值在
[0,1]
之间变化。在矩阵中,有两个值是
>1
。当您将其写入文件时,这些值将饱和为1,然后保存到文件中。实际上,甚至在写入之前,强度将被缩放,以便它们是
uint8
,并且在
[0255]
之间变化。当您尝试重新读取这些值时,它将被读取为强度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个可能的双精度值(假设为灰度),因此您无法以这种方式捕获所有可能的浮点值

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


如果您想使用JPEG 2000标准对任意数据进行编码,也许您应该下载。我还没有仔细研究它,但它可能能够使用JPEG 2000算法压缩任意数据。

非常感谢您的评论和建议的解决方案。@user3720389-非常欢迎!如果这有帮助的话,请考虑接受我的回答。这可以通过点击我文章顶部的复选标记图标来完成,在向上和向下箭头的左侧下方。