2016-12-13 7 views
0

Я программирую алгоритм jpeg ремесленника. Однако, шаг квантования представляется проблематичным: Вот картинка я пытаюсь кодировать: Lena.pngJpeg artefact (зеленый пиксель)

И вот результат сразу после шага квантования (+ декодирования, но без Хаффмана материала кодирования): 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