Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
转换C+时,图像上的DCT变换结果不同的问题+;到C#_C#_Opencv_Image Processing_Dct - Fatal编程技术网

转换C+时,图像上的DCT变换结果不同的问题+;到C#

转换C+时,图像上的DCT变换结果不同的问题+;到C#,c#,opencv,image-processing,dct,C#,Opencv,Image Processing,Dct,我试着编写一个应用程序,对图像片段进行DCT-2变换,然后用逆DCT-2变换回来。我在c++/opencv中找到了我试图转换为c#的代码,但不知何故,我在某个点上得到了不同的结果。以下是我试图转换的代码: for (unsigned v = 0; v < BLOCK_SIZE; ++v) { for (unsigned u = 0; u < BLOCK_SIZE; ++u) { const double cu = (u == 0) ? 1.

我试着编写一个应用程序,对图像片段进行DCT-2变换,然后用逆DCT-2变换回来。我在c++/opencv中找到了我试图转换为c#的代码,但不知何故,我在某个点上得到了不同的结果。以下是我试图转换的代码:

for (unsigned v = 0; v < BLOCK_SIZE; ++v)
{   
    for (unsigned u = 0; u < BLOCK_SIZE; ++u)
    {   
        const double cu = (u == 0) ? 1.0 / sqrt(2) : 1.0;
        const double cv = (v == 0) ? 1.0 / sqrt(2) : 1.0;
        double dctCoeff = 0;

        for (unsigned y = 0; y < BLOCK_SIZE; ++y)
        {   
            for (unsigned x = 0; x < BLOCK_SIZE; ++x)
            {   
                double uCosFactor = cos((double)(2 * x + 1) * M_PI * (double)u / (2 * (double) BLOCK_SIZE));
                double vCosFactor = cos((double)(2 * y + 1) * M_PI * (double)v / (2 * (double) BLOCK_SIZE));
                double pixel = (double)(lenaNoseGrey.at<unsigned char>(cv::Point(x,y)));
                dctCoeff += pixel * uCosFactor * vCosFactor;
            }
        }
        dctCoeff *= (2 / (double) BLOCK_SIZE) * cu * cv;
        lenaNoseDct.at<double>(cv::Point(u,v)) = dctCoeff;
    }
}   
for(无符号v=0;v
这是我的:

for (int v = 0; v < BLOCK_SIZE; ++v)
{   
    for (int u = 0; u < BLOCK_SIZE; ++u)
    {   

        double cu = (u == 0) ? 1.0 / Math.Sqrt(2) : 1.0;
        double cv = (v == 0) ? 1.0 / Math.Sqrt(2) : 1.0;
        double dctCoeff = 0;
        double dctCoeffAlpha = 0;

        for (int y1 = 0; y1 < BLOCK_SIZE; ++y1)
        {   
            for (int x1 = 0; x1 < BLOCK_SIZE; ++x1)
            {   
                double uCosFactor = Math.Cos((2 * x1 + 1) * Math.PI * u / (2 * (double)BLOCK_SIZE));
                double vCosFactor = Math.Cos((2 * y1 + 1) * Math.PI * v / (2 * (double)BLOCK_SIZE));
                double pixel = (double)bitmapaWy1.GetPixel((x1 + 284), (y1 + 313)).R;
                double pixelalpha = (double)bitmapaWy1.GetPixel((x1 + 284), (y1 + 313)).A;
                dctCoeff += pixel * uCosFactor * vCosFactor;
                //dctCoeffAlpha += pixelalpha * uCosFactor * vCosFactor;
                dctCoeffAlpha = pixelalpha;

            }
        }
        dctCoeffAlpha *= (2 / (double)BLOCK_SIZE) * cu * cv;
        dctCoeff *= (2 / (double)BLOCK_SIZE) * cu * cv;
        macierz[u, v] = dctCoeff;

    }
}
for(int v=0;v
<>我的矩阵有不同的结果,但是当我用上面的逆代码从C++代码转换矩阵时,它工作得很好。 你能找出我做错了什么吗?我可以看到的一个区别是GETEngin方法,但是它是在C++代码执行的完全相同的灰度图像和图像片段上执行的。p>
当我把我的矩阵和图像反向时,我可以看到图像,但它有很多随机像素,太白或太黑

这显然是一个精度问题

问题最有可能出现在以下几行:

 macierz[u, v] = dctCoeff;
我还怀疑:

            double pixel = (double)bitmapaWy1.GetPixel((x1 + 284), (y1 + 313)).R;
            double pixelalpha = (double)bitmapaWy1.GetPixel((x1 + 284), (y1 + 313)).A;
            dctCoeff += pixel * uCosFactor * vCosFactor;
            //dctCoeffAlpha += pixelalpha * uCosFactor * vCosFactor;
            dctCoeffAlpha = pixelalpha;

问题解决了,问题是代码太多,我发布的实际代码有效,问题是我在发布代码之后的代码,它将“dctcoff”更改为byte,并且它在循环内,所以dct的值没有重置为0

int BLOCK_SIZE = 16;
        double[,] macierz = new double[16, 16];

        for (int v = 0; v < BLOCK_SIZE; ++v)
        {
            for (int u = 0; u < BLOCK_SIZE; ++u)
            {

                 double cu = (u == 0) ? 1.0 / Math.Sqrt(2) : 1.0;
                double cv = (v == 0) ? 1.0 / Math.Sqrt(2) : 1.0;
                double dctCoeff = 0;


                for (int y1 = 0; y1 < BLOCK_SIZE; ++y1)
                {
                    for (int x1 = 0; x1 < BLOCK_SIZE; ++x1)
                    {
                        double uCosFactor = Math.Cos((2 * x1 + 1) * Math.PI * u / (2 * (double)BLOCK_SIZE));
                        double vCosFactor = Math.Cos((2 * y1 + 1) * Math.PI * v / (2 * (double)BLOCK_SIZE));
                        double pixel = bitmapaWy1.GetPixel((x1 + 284), (y1 + 313)).R;

                        dctCoeff += pixel * uCosFactor * vCosFactor;
                        //dctCoeffAlpha += pixelalpha * uCosFactor * vCosFactor;


                    }
                }

                dctCoeff *= (2 / (double)BLOCK_SIZE) * cu * cv;
                macierz[u, v] = dctCoeff;

            }
        }
int BLOCK_SIZE=16;
double[,]macierz=新的double[16,16];
用于(int v=0;v

这个代码就像一个符咒。我希望一些好的灵魂会使用它,因为我花了大约20个小时使它工作。

我不能第一眼告诉你,但是为了排除故障,你为什么不用一些(内联)测试值和输出(或写下)替换对
lenaNoseGrey.at(…)
GetPixel
方法的调用所有的中介变量(和其他相关中介结果)来自C++和C语言程序,并比较结果。你的C语言程序偏离C++程序应该会变得更加明显。应该不会太难…什么是
APP
?+1对于elgonzo来说。将每个算法中的中间数据写入一个单独的文件,然后您可以对它们进行区分,以找出错误所在。还可以在您的版本中将u、v、y和y循环变量更改为无符号。你有兴趣。原始版本包含未签名的整数。这对循环计数并不重要,但可以在浮点计算中使用它们。。。