簡體   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