[英]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.