Как преобразовать блок DCT обратно в значения цвета? - PullRequest
0 голосов
/ 13 февраля 2020

Поэтому я пытаюсь использовать это https://www.nayuki.io/res/fast-discrete-cosine-transform-algorithms/NaiveDct.cs в своем задании по обработке изображений, в котором мы должны применить DCT к изображению. (блок 8x8)

static public double[,] Dct(double[,] array)
    {
        double[,] dct = new double[N, M];
        double factor = Math.PI / (N * M);
        //dct
        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {                    
                double sum = 0;
                for (int k = 0; k < M; k++)
                {
                    for (int l = 0; l < N; l++)
                    {
                        sum += array[k, l] * Math.Cos((k * M + l + 0.5) * (i * M + j) * factor);
                    }
                }
                dct[i, j] = (int) sum;
            }
        }
        return dct;
    }

Это метод, который я использую для прямого преобразования. Результаты для блока 8x8 выглядят следующим образом enter image description here

Но при попытке восстановить «цветной блок» (в данном случае он использовался для «синих» значений цвет rgb) . С этим кодом:

  static public double[,] inverseDct(double[,] array)
    {
        double[,] colorBlock = new double[N, M];
        double factor = Math.PI / (N * M);
        //dct
        for (int i = 0; i < M; i++)
        {
            for (int j = 0; j < N; j++)
            {

                double sum = array[0, 0] / 2;

                for (int k = 0; k < M; k++)
                {
                    int l = 0;
                    if (k == 0) l = 1;
                    for (; l < N; l++)
                    {
                        sum += array[k, l] * Math.Cos((k * M + l) * ((i * M + j) + 0.5) * factor);
                    }
                }
                colorBlock[i, j] = (int) sum;
            }
        }
        return colorBlock;
    }

Кажется, он не работает должным образом, потому что вывод (блок значения синего цвета на рисунке выше) теперь говорит это: enter image description here

Я разместил весь свой код здесь: https://pastebin.com/XbCE3kBK

Как мне вернуть мой " цвет "значения из блока DCT? (делает обратное преобразование?)

...