gpt4 book ai didi

c++ - DCT 实现的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:07 24 4
gpt4 key购买 nike

我必须在 C++ 中实现 DCT 算法,这是我目前的代码:

// 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 算法进行了如下比较:

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 算法是错误的,但我搜索了几个小时也找不到我的错误,谁能告诉我我哪里做错了什么?

最佳答案

您的指数计算有误。在 indexNumber = x * oBlock.rows + y; 中,由于 x 正在计算行数,因此需要将其乘以列数:

indexNumber = x * oBlock.cols + y;

同样适用于 indexNumber = u * oBlock.rows + v;

indexNumber = u * oBlock.cols + v;

关于c++ - DCT 实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com