2016-12-13 62 views
0

我正在編寫一個手工jpeg算法。然而,量化步長似乎是有問題的: 這裏是我試圖編碼圖像:Lena.pngJpeg壓縮人造體(綠色像素)

這裏是結果剛過量化步長(+解碼但沒有哈夫曼編碼的東西):post quantization result

現在我的這一步代碼:

def quantification(transformee) : 
matrice=np.array([(16 , 11 , 10 , 16 , 24 , 40 , 51 , 61),(12 , 12 , 14 , 19 , 26 , 58 , 60 , 55),(14 , 13 , 16 , 24 , 40 , 57 , 69 , 56),(14 , 17 , 22 , 29 , 51 , 87 , 80 , 62),(18 , 22 , 37 , 56 , 68 , 109 , 103 , 77),(24 , 35 , 55 , 64 , 81 , 104 , 113 , 92),(49 , 64 , 78 , 87 , 103 , 121 , 120 , 101),(72 , 92 , 95 , 98 , 112 , 100 , 103 , 99)],dtype=float) 
quanti=[] 
for i in transformee : 
    k=i/matrice 
    quanti+=[np.around(k)] 
return quanti 

def dequantification(quanti) : 
matrice=np.array([(16 , 11 , 10 , 16 , 24 , 40 , 51 , 61),(12 , 12 , 14 , 19 , 26 , 58 , 60 , 55),(14 , 13 , 16 , 24 , 40 , 57 , 69 , 56),(14 , 17 , 22 , 29 , 51 , 87 , 80 , 62),(18 , 22 , 37 , 56 , 68 , 109 , 103 , 77),(24 , 35 , 55 , 64 , 81 , 104 , 113 , 92),(49 , 64 , 78 , 87 , 103 , 121 , 120 , 101),(72 , 92 , 95 , 98 , 112 , 100 , 103 , 99)],dtype=float) 
retour_transformee=[] 
for k in quanti : 
    temp=np.zeros((8,8),dtype=float) 
    for i in range(8) : 
     for j in range(8) : 
      temp[i,j]=matrice[i,j]*k[i,j] 
    retour_transformee.append(temp) 
return retour_transformee 

transformee是8×8矩陣列表(DCT已被使用)。 量化矩陣是維基百科(JPEG)給出的

對不起,法國部分在算法

回答

0

圖像看起來像你不是解碼後的限幅值。

通過量化改變的DCT係數可能導致IDCT產生在0-255範圍之外的值。

+0

感謝您的建議,我沒有糾正我的算法。但是,我已經對IDCT結果進行了測試:所有係數都在0和255之間([[-128:+127]]將值置於0中間)。最後的照片也一樣。 – Merlu

0

我建議確保您的RGB到YCbCr和YCbCr到RGB轉換確保您被鉗位到[0..255]。兩個顏色空間重疊但不完全相同。

+0

感謝您的建議,我會嘗試 – Merlu