- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经设法计算了 8*8 矩阵的 dct,但在求逆时遇到了问题。谁能看看这段代码并告诉我我现在在做什么。我应该得到与以前完全相同的值,但我得到了不同的值。我正在读取来自 csv 文件的输入并将其放入另一个 csv 文件。它是用 c 语言编写的
void idct_func(float inMatrix[8][8]){
double idct,
Cu,
sum,
Cv;
int i,
j,
u,
v;
float idctMatrix[8][8],
greyLevel;
FILE * fp = fopen("mydata.csv", "r");
FILE * wp = fopen("idct.csv", "w");
fprintf(fp, "\n Inverse DCT");
for (i = 0; i < 8; ++i) {
for (j = 0; j < 8; ++j) {
sum = 0.0;
for (u = 0; u < 8; u++) {
for (v = 0; v < 8; v++) {
if (u == 0)
Cu = 1.0 / sqrt(2.0);
else
Cu = 1.0;
if (v == 0)
Cv = 1.0 / sqrt(2.0);
else
Cv = (1.0);
// Level around 0
greyLevel = idctMatrix[u][v];
idct = (greyLevel * cos((2 * i + 1) * u * M_PI / 16.0) *
cos((2 * j + 1) * v * M_PI / 16.0));
sum += idct;
}
}
idctMatrix[i][j] = 0.25 * Cu * Cv * sum;
fprintf(wp, "\n %f", idctMatrix[i][j]);
}
fprintf(wp, "\n");
}
原始矩阵为:
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255},
{255, 255, 255, 255, 255, 255, 255, 255}};
dct 是:
2040 0 -0 0 0 0 -0 -0
0 0 0 0 -0 0 -0 0
-0 0 -0 0 0 0 0 0
0 -0 -0 -0 0 -0 -0 0
0 0 -0 0 -0 -0 -0 0
0 -0 -0 -0 -0 0 -0 -0
-0 -0 -0 0 0 0 0 -0
-0 0 0 0 -0 0 -0 0
计算出来的idct应该和原来的一样
最佳答案
您正在尝试就地计算 IDCT,使用 idctMatrix[][]
作为输入和输出,因此在此过程中输入被修改。那是错误的。您需要有一个单独的二维数组用于输入(或输出)。
还显示,依赖于 u 和 v 的比例因子 Cu
和 Cv
应用在 u 和 v 循环之外。那也是错误的。
编辑:如果您无法理解这些词,请查看代码:
#include <stdio.h>
#include <math.h>
#ifndef M_PI
#define M_PI 3.14159265358979324
#endif
void Compute8x8Dct(const double in[8][8], double out[8][8])
{
int i, j, u, v;
double s;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
s = 0;
for (u = 0; u < 8; u++)
for (v = 0; v < 8; v++)
s += in[u][v] * cos((2 * u + 1) * i * M_PI / 16) *
cos((2 * v + 1) * j * M_PI / 16) *
((i == 0) ? 1 / sqrt(2) : 1) *
((j == 0) ? 1 / sqrt(2) : 1);
out[i][j] = s / 4;
}
}
void Compute8x8Idct(const double in[8][8], double out[8][8])
{
int i, j, u, v;
double s;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
s = 0;
for (u = 0; u < 8; u++)
for (v = 0; v < 8; v++)
s += in[u][v] * cos((2 * i + 1) * u * M_PI / 16) *
cos((2 * j + 1) * v * M_PI / 16) *
((u == 0) ? 1 / sqrt(2) : 1.) *
((v == 0) ? 1 / sqrt(2) : 1.);
out[i][j] = s / 4;
}
}
void Print8x8(const char* title, const double in[8][8])
{
int i, j;
printf("%s\n", title);
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
printf("%8.3f ", in[i][j]);
printf("\n");
}
}
int main(void)
{
double pic1[8][8], dct[8][8], pic2[8][8];
int i, j;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
#if 01
pic1[i][j] = 255;
#else
pic1[i][j] = (i ^ j) & 1;
#endif
Print8x8("pic1:", pic1);
Compute8x8Dct(pic1, dct);
Print8x8("dct:", dct);
Compute8x8Idct(dct, pic2);
Print8x8("pic2:", pic2);
return 0;
}
这是它的输出:
pic1:
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
dct:
2040.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
pic2:
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
255.000 255.000 255.000 255.000 255.000 255.000 255.000 255.000
关于c - 尝试实现 dct 8*8 矩阵的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553717/
我正在labview中创建一个2D DCT-II,但希望能够检查我的输出是否正确。 SciPy 有一个很好的 DCT 函数,它默认为 DCT-II 但为 1D。 我想让它适用于二维数组。为此,必须将
我想使用 scipy 的 DCT-II,因为它已经编码并且速度很快。看着 doc ,它似乎是一维实现。是否可以以这样的方式使用它来将其用作 3D 实现?我不确定数学。 2D 和 3D 实现是否相当于在
dct在opencv中转换不正确。 imf = np.float32(块) dct = cv2.dct(imf) [[154,123,123,123,123,123,123,13
我需要使用图像色彩空间的DCT。 我有RGB imagem,需要将其转换为YUV Space并进行DCT。 这是我的代码: import cv2 import scipy # reading the
这是DCT源代码..!!!未知的 4x4 DCT 数组将通过将 4x4 数组分割成几个 block 来完成,每个 block 上经过 yyang 2x2 变换......!!!我想问,如何显示一个已经
我在 Matlab 中使用一个函数来计算图像的 DCT(离散余弦变换)。我不知道我的代码有什么问题,但我得到了一个相同编号的输出图像。我想将这个公式用于我的 DCT。 请有任何想法。 func
我必须在 C++ 中实现 DCT 算法,这是我目前的代码: // dct: computes the discrete cosinus tranform of a 8x8 block template
所以我正在尝试编写一个简单的 bmp 到 jpeg 图像转换器程序。您可能知道 jpeg 压缩、DCT、量化和熵编码涉及 3 个主要步骤。我想将在每个中间阶段计算的值写入一个文件。 现在我的问题是,在
我必须为我的项目对图像进行 2d DCT。我将公式正确地翻译成代码。逻辑上一切似乎都很好,但它没有给出所需的结果。我已经用 matlab 函数对其进行了统计,以检查 3x3 矩阵的结果,但它们不正确。
对于一个项目,我必须演示 JPEG 压缩以及使用 DCTII 和 IDCT 的转换。我不知道如何实现这个公式。但我找到了一个网站,提供了Java代码和在线IDE进行测试。 https://ide.ge
根据 Octave documentation for dct2 , dct2 (x) 计算矩阵 x 的二维离散余弦变换,但是当我尝试以下代码时,出现错误,我可能做错了什么? A= imread('i
由于简单的 8X8 矩阵可以通过对其执行 DCT 来加密,并且通过对 DCT 矩阵应用 IDCT 可以轻松解密原始矩阵;我试图通过“ block 处理”( block 大小 8 )对图像的每个 blo
这是代码: void dct(const tga_image *tga, double data[8][8], const int xpos, const int ypos) { in
一般来说,使用 DCT 嵌入消息涉及 4 个步骤: 将图像分为 8x8 block 使用 DCT 数学运算转换每个 block 量化每个 DCT block (有损压缩) 嵌入量化系数中的消息位(避免
我们正在编写针对某些 Intel 硬件的图像处理算法。通常我们更喜欢通用的 C 实现,但我们已经确定了一种算法,其核心执行大量离散余弦变换 (DCT),效果非常好。不幸的是,我们的吞吐量要求使得通用
我拍了下图: 将其分成 8X8 个图 block ,对每个图 block 进行 2D DCT 变换,并将它们切割成每个轴上的前 30 个系数。现在我试图将结果可视化为图像,这将有助于我在 DCT 平面
我正在对 512 * 512 原始图像进行 DCT/IDCT, 但是我的程序可以输出只有 PSNR 17.54db 的图像, 我已经多次检查我的公式,有人可以帮我解决这个问题吗? This is or
我写下了一个openCV代码。我试图在512X512的图像中嵌入一个64X64像素的水印图像。我的代码有 5 个部分: 读两张图片(水印和我想要的原图嵌入水印) 将 2 个读取的图像调整为指定大小。(
我正在尝试通过使用对图像实现二维离散余弦变换一维 DCT 运算。如果我将它与 dct2 MATLAB 函数进行比较,我的输出是不正确的。我不明白我的代码出了什么问题以及它在哪里发生。 如果有人能指出错
我正在使用离散余弦变换测试库。 #include void dump_vector(int n, double* vec) { for(int i = 0; i < n; i++)
我是一名优秀的程序员,十分优秀!