Поэтому я пытаюсь использовать это 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 выглядят следующим образом
Но при попытке восстановить «цветной блок» (в данном случае он использовался для «синих» значений цвет 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;
}
Кажется, он не работает должным образом, потому что вывод (блок значения синего цвета на рисунке выше) теперь говорит это:
Я разместил весь свой код здесь: https://pastebin.com/XbCE3kBK
Как мне вернуть мой " цвет "значения из блока DCT? (делает обратное преобразование?)