首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DCT实现的问题

DCT实现的问题
EN

Stack Overflow用户
提问于 2016-02-05 07:46:34
回答 1查看 484关注 0票数 1

我必须在C++中实现一个离散余弦变换算法,下面是我现在的代码:

代码语言:javascript
复制
// dct: computes the discrete cosinus tranform of a 8x8 block
template<typename Tin=uchar,typename Tout=float>
inline cv::Mat_<Tout> dct(const cv::Mat_<Tin>& oBlock) {

int indexNumber;
float pi = 3.14159265359;
float fcoscos, fxy, cos1, cos2, forCos1, forCos2;

cv::Mat_<Tout> resultBloc(8, 8);

for (int u = 0; u < oBlock.rows; u++){
    for (int v = 0; v < oBlock.cols; v++){

        float cu=0, cv=0, Result=0;

        // calcul c(u)
        if (u == 0){
            cu = (float)sqrt((float)1 / (float)oBlock.rows);
        }
        else {
            cu = (float)sqrt((float)2 / (float)oBlock.rows);
        }

        // calcul c(v)
        if (v == 0){
            cv = (float)sqrt((float)1 / (float)oBlock.cols);
        }
        else {
            cv = (float)sqrt((float)2 / (float)oBlock.cols);
        }

        float sums = 0;

        for (int x = 0; x < oBlock.rows; x++){
            for (int y = 0; y < oBlock.cols; y++){

                indexNumber = x * oBlock.rows + y;
                fxy = (int)oBlock.data[indexNumber];

                forCos1 = (pi*((2 * x) + 1)*u) / (2 * oBlock.rows);
                forCos2 = (pi*((2 * y) + 1)*v) / (2 * oBlock.cols);

                cos1 = cos(forCos1);
                cos2 = cos(forCos2);

                fcoscos = fxy * cos1 * cos2; 

                sums += fcoscos;

            }
        }

        // calcul total
        Result = sums*cu*cv;

        indexNumber = u * oBlock.rows + v;
        resultBloc.data[indexNumber] = Result;

    }
}

return resultBloc;

}

我将结果与cv DCT算法进行了比较,结果如下:

代码语言:javascript
复制
cv::Mat_<float> tempImage(8,8);

for (int i = 0; i < vecImageCut[0].cols*vecImageCut[0].rows; i++){
    tempImage.data[i] = (int)vecImageCut[0].data[i];
}
cv::Mat_<float> dctCV;
cv::dct(tempImage, dctCV);
for (int i = 0; i < blocksAfterDCT[0].cols*blocksAfterDCT[0].rows; i++){
    std::cerr << "Difference DCT for pixel " << i << " : " << dctCV.data[i] - blocksAfterDCT[0].data[i] << std::endl;
}

我的DCT和cv DCT之间的结果非常不同,所以我假设我的DCT算法是错误的,但我搜索了几个小时,仍然找不到我的错误,有人能告诉我我哪里做错了吗?

EN

回答 1

Stack Overflow用户

发布于 2016-02-05 08:26:38

您的索引计算错误。在indexNumber = x * oBlock.rows + y;中,由于x计算的是行数,因此需要乘以列数:

代码语言:javascript
复制
indexNumber = x * oBlock.cols + y;

indexNumber = u * oBlock.rows + v;也是如此

代码语言:javascript
复制
indexNumber = u * oBlock.cols + v;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35213869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档