2016-12-13 57 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