我正在編寫一個手工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)給出的
對不起,法國部分在算法
感謝您的建議,我沒有糾正我的算法。但是,我已經對IDCT結果進行了測試:所有係數都在0和255之間([[-128:+127]]將值置於0中間)。最後的照片也一樣。 – Merlu