Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何将DCT块转换回颜色值?_Image Processing_Colors_Compression_Jpeg_Dct - Fatal编程技术网

Image processing 如何将DCT块转换回颜色值?

Image processing 如何将DCT块转换回颜色值?,image-processing,colors,compression,jpeg,dct,Image Processing,Colors,Compression,Jpeg,Dct,所以我试着用这个 在我的图像处理作业中,我们应该对图片应用DCT。(8x8块) 静态公共双[,]Dct(双[,]数组) { double[,]dct=新的double[N,M]; 双因子=Math.PI/(N*M); //离散余弦变换 for(int i=0;i

所以我试着用这个 在我的图像处理作业中,我们应该对图片应用DCT。(8x8块)

静态公共双[,]Dct(双[,]数组)
{
double[,]dct=新的double[N,M];
双因子=Math.PI/(N*M);
//离散余弦变换
for(int i=0;i
这是我用于正向转换的方法。 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;
    }
静态公共双[,]反向CT(双[,]阵列)
{
双色[,]色块=新双色[N,M];
双因子=Math.PI/(N*M);
//离散余弦变换
for(int i=0;i
它似乎无法正常工作,因为(上图中蓝色值块)的输出现在显示:

我在这里发布了我的全部代码:


如何从DCT块中获取“颜色””值?(进行反向变换?

我注意到的第一个算法问题(没有寻找其他问题):在正向DCT中,系数是每个值的总和,乘以余弦因子。在逆DCT中,取一个系数,然后将其乘以余弦因子,加到每个值上。您的“colorBlock”应该位于最里面的循环中。提示:
public static double[]InverseTransform(double[]vector)
:在指定数组上计算未缩放的DCT类型III,并返回一个新数组。
  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;
    }