@tsolre

Реализация алгоритма binDCT. Сравнение с обычным DCT. Почему разные результаты?

Здравствуйте,
Пытаюсь реализовать и разобраться в алгоритме binDCT. Нашел вот такое описание. Вот обычный DCT, с примером, на странице 3 есть исходная матрица значений 8х8, а чуть ниже матрица с вычисленными значениями DCT коэфициентов.
Для начала я пробую реализовать сам алгоритм binDCT (версию А) на Питоне, что бы понять последовательность действий и получить хотя бы приблизительно такой же результат как в обычном примере. В документации на binDCT описан 1D алгоритм, но двумерную матрицу надо обрабатывать в таком порядке:
1. Сначала преобразуем каждую строку по алгоритму в схеме.
2. Затем преобразованию подвергаются столбцы матрицы полученной в результате пункта один.
Т.е. проходим строки, транспонируем матрицу, проходим строки опять же, транспонируем обратно
Сам алгоритм в доке(я использую версию А) можно разбить на 7 этапов. Показано на рисункеa5172df19e454dcfa3fe1f58cdd5693d.png.
Вот питоновский скрипт этого алгоритма(специально разбит на этапы и избыточен для удобства поиска ошибок и быстрой замены коэф.)
import numpy as np

M = np.matrix('26 -5 -5 -5 -5 -5 -5 8; 64 52 8 26 26 26 8 -18; 126 70 26 26 52 26 -5 -5; 111 52 8 52 52 38 -5 -5; 52 26 8 39 38 21 8 8; 0 8 -5 8 26 52 70 26 ; -5 -23 -18 21 8 8 52 38; -18 8 -5 -5 -5 8 26 8')

def dct_row (iarray):
   tmp1d1 = np.zeros(8)
   tmp1d2 = np.zeros(8)
   tmp1d3 = np.zeros(8)
   tmp1d4 = np.zeros(8)
   tmp1d5 = np.zeros(8)
   tmp1d6 = np.zeros(8)
   tmp1d7 = np.zeros(8)
   i = 0
   while i <=7:
#stage 1
      tmp1d1[0] = iarray[i,0] + iarray[i,7]
      tmp1d1[1] = iarray[i,1] + iarray[i,6]
      tmp1d1[2] = iarray[i,2] + iarray[i,5]
      tmp1d1[3] = iarray[i,3] + iarray[i,4]
      tmp1d1[4] = iarray[i,3] - iarray[i,4]
      tmp1d1[5] = iarray[i,2] - iarray[i,5]
      tmp1d1[6] = iarray[i,1] - iarray[i,6]
      tmp1d1[7] = iarray[i,0] - iarray[i,7]
#stage 2      
      tmp1d2[0] = tmp1d1[3] + tmp1d1[0]
      tmp1d2[1] = tmp1d1[2] + tmp1d1[1]
      tmp1d2[2] = tmp1d1[1] - tmp1d1[2]
      tmp1d2[3] = tmp1d1[0] - tmp1d1[3]
      tmp1d2[4] = tmp1d1[4]
      tmp1d2[5] = tmp1d1[5] - 0.4375*tmp1d1[6]
      tmp1d2[6] = tmp1d1[6]
      tmp1d2[7] = tmp1d1[7]
#stage 3      
      tmp1d3[0] = tmp1d2[1] + tmp1d2[0]
      tmp1d3[1] = tmp1d2[1]
      tmp1d3[2] = 0.375*tmp1d2[3] - tmp1d2[2]
      tmp1d3[3] = tmp1d2[3]
      tmp1d3[4] = tmp1d2[4]
      tmp1d3[5] = tmp1d2[5]
      tmp1d3[6] = 0.6875*tmp1d2[5] + tmp1d2[6]
      tmp1d3[7] = tmp1d2[7]
#stage 4      
      tmp1d4[0] = tmp1d3[0]
      tmp1d4[1] = tmp1d3[0]*0.5 - tmp1d3[1]
      tmp1d4[2] = tmp1d3[2]
      tmp1d4[3] = tmp1d3[3] - 0.375*tmp1d3[2] 
      tmp1d4[4] = tmp1d3[4]
      tmp1d4[5] = 0.375*tmp1d3[6] - tmp1d3[5] 
      tmp1d4[6] = tmp1d3[7] - tmp1d3[6]
      tmp1d4[7] = tmp1d3[7] + tmp1d3[6]
#stage 5      
      tmp1d5[0] = tmp1d4[0]
      tmp1d5[1] = tmp1d4[1]
      tmp1d5[2] = tmp1d4[2]
      tmp1d5[3] = tmp1d4[3]
      tmp1d5[4] = tmp1d4[4] + tmp1d4[5]
      tmp1d5[5] = tmp1d4[4] - tmp1d4[5]
      tmp1d5[6] = tmp1d4[2]
      tmp1d5[7] = tmp1d4[5]
#stage 6      
      tmp1d6[0] = tmp1d5[0]
      tmp1d6[1] = tmp1d5[1]
      tmp1d6[2] = tmp1d5[2]
      tmp1d6[3] = tmp1d5[3]
      tmp1d6[4] = 0.1875*tmp1d5[7] - tmp1d5[4]
      tmp1d6[5] = 0.875*tmp1d5[6] + tmp1d5[5] 
      tmp1d6[6] = tmp1d5[6]
      tmp1d6[7] = tmp1d5[7]
#stage 7      
      tmp1d7[0] = tmp1d6[0]
      tmp1d7[1] = tmp1d6[1]
      tmp1d7[2] = tmp1d6[2]
      tmp1d7[3] = tmp1d6[3]
      tmp1d7[4] = tmp1d6[4]
      tmp1d7[5] = tmp1d6[5]
      tmp1d7[6] = tmp1d6[6] - 0.5*tmp1d6[5]
      tmp1d7[7] = tmp1d6[7] - 0.1875*tmp1d6[4]

#      
      iarray[i,0] = tmp1d5[0]
      iarray[i,1] = tmp1d5[4]
      iarray[i,2] = tmp1d5[6]
      iarray[i,3] = tmp1d5[2]
      iarray[i,4] = tmp1d5[7]
      iarray[i,5] = tmp1d5[5]
      iarray[i,6] = tmp1d5[3]
      iarray[i,7] = tmp1d5[1]
      
      i = i+1
   return iarray

f = dct_row(M)      
f = f.transpose()
res = dct_row(f)
res = res.transpose()
print res

DCT коэфициенты которые я получаю в результат и близко не подходят к примеру. Более того они не даже не кратные.
[1298  114 -122 -122  144 -173  105  121]
[  83   50  -10  -10   54  -57  -23  -46]
[  47  -49   32   32    7  -64   44  -51]
[  47  -49   32   32    7  -64   44  -51]
[ -19   11  -21  -21   14  -16  -37  -67]
[ 122   27   32   32   25  -24   51   88]
[-499  -68  -16  -16  -88  109   41  -81]
[-125   26   35   35   10    5  -14   28]

Подскажите что я делаю не так ?
  • Вопрос задан
  • 157 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы