- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试通过使用对图像实现二维离散余弦变换一维 DCT 运算。如果我将它与 dct2
MATLAB 函数进行比较,我的输出是不正确的。我不明白我的代码出了什么问题以及它在哪里发生。
如果有人能指出错误或任何其他建议,那将非常有帮助。
这是我用 MATLAB 编写的代码
% main function
signal=rand(100);
signal_dct=myDCT(signal);
figure; imshow((signal_dct));
% function to calculate 2D DCT of an image
function res=myDCT(signal)
signal=double(signal);
l=size(signal,1);
res=zeros(l); %initialize the final result matrix
for k=1:l %calculate 1D DCT of each row of image
res(k,:)=mdct(signal(k,:));
end
for k=1:l %calculate 1D DCT of each column of image
res(:,k)=mdct(res(:,k));
end
end
%% function to calculate 1D DFT of a 1D signal
function res=mdct(signal)
l=size(signal,1);
for i=1:l
if i==1 %for signal index of 1, alpha is 1/sqrt(l)
alpha=sqrt(1/l);
else %for signal index of greater than 1
alpha=sqrt(2/l);
end
j=[1:l];
% summation calculates single entry of res by applying the
% formula of DCT on the signal
summation=sum(sum(signal(j)*cos((pi*(2*(j-1)+1)*(i-1))/(2*l))));
res(i)=alpha*summation;
end
end
最佳答案
您是正确的,因为 2D DCT 是可分离的。您只需先将 1D DCT 应用于每一行,然后获取中间结果并将其应用于列。但是,您有两个基本错误。让我们来看看它们。
具体来说,请查看您的 mdct
函数中的以下语句:
l=size(signal,1);
因为您对每一行应用 DCT,然后对每一列应用 DCT,所以只有当您将 DCT 应用到列 时,以上内容才有效。 size(signal,1)
如果输入是一列,肯定会给出输入向量的长度。但是,如果您的输入是行,则size(signal,1)
的输出将为1。因此,您应该将 size(signal,1)
替换为 numel
,这样您就可以确保获得元素的总数 - 无论输入是一行还是专栏。
此外,如果您想让代码兼容以在 DCT 循环中进行求和,您应该确保输入是一个行向量无论如何。因此,改为这样做:
l = numel(signal);
signal = signal(:).';
第一行确定我们的输入信号有多少个元素,第二行确保我们有一个行向量。这是通过 (:)
将元素展开到列向量中,然后执行 .'
以确保我们转置结果以获得行向量来完成的。
接下来,您将不得不在求和中进行逐元素乘法运算,以获得您要查找的结果。您也不需要额外的 sum
调用。这是多余的。因此,将求和语句修改为:
summation=sum(signal.*cos((pi*(2*(j-1)+1).*(i-1))/(2*l)));
没有必要做 signal(j)
因为 j
跨越向量的整个长度,你可以用 signal
。
一旦我做了这些改变,我就在一个较小尺寸的矩阵上做了这个,以确保我们得到相同的结果:
rng(123123);
signal=rand(7);
signal_dct=myDCT(signal);
signal_dct2 = dct2(signal);
最后一行代码调用 dct2
,这样我们就可以将您的自定义函数的结果与 dct2
给我们的结果进行比较。
我们得到:
>> signal_dct
signal_dct =
3.7455 -0.1854 -0.1552 0.3949 0.2182 -0.3707 0.2621
-0.2747 0.1566 -0.0955 0.1415 0.3156 -0.0503 0.8581
-0.2095 0.0233 -0.2769 -0.4341 -0.1639 0.3700 -0.2282
-0.0282 0.0791 0.0517 0.4749 -0.0169 -0.4327 0.0427
-0.4047 -0.4383 0.3415 -0.1120 -0.0229 0.0310 0.3767
-0.6058 -0.0389 -0.3460 0.2732 -0.2395 -0.2961 0.1789
-0.0648 -0.3173 -0.0584 -0.3461 -0.1866 0.0301 0.2710
>> signal_dct2
signal_dct2 =
3.7455 -0.1854 -0.1552 0.3949 0.2182 -0.3707 0.2621
-0.2747 0.1566 -0.0955 0.1415 0.3156 -0.0503 0.8581
-0.2095 0.0233 -0.2769 -0.4341 -0.1639 0.3700 -0.2282
-0.0282 0.0791 0.0517 0.4749 -0.0169 -0.4327 0.0427
-0.4047 -0.4383 0.3415 -0.1120 -0.0229 0.0310 0.3767
-0.6058 -0.0389 -0.3460 0.2732 -0.2395 -0.2961 0.1789
-0.0648 -0.3173 -0.0584 -0.3461 -0.1866 0.0301 0.2710
如您所见,这两个结果是匹配的。我觉得不错!
为了确保我们的一致性,这是您的两个函数的完整代码 list ,以及我所做的修改:
% function to calculate 2D DCT of an image
function res=myDCT(signal)
signal=double(signal);
l=size(signal,1);
res = zeros(l);
for k=1:l %calculate 1D DCT of each row of image
res(k,:)=mdct(signal(k,:));
end
for k=1:l %calculate 1D DCT of each column of image
res(:,k)=mdct(res(:,k));
end
end
%% function to calculate 1D DFT of a 1D signal
function res=mdct(signal)
%// Change
l = numel(signal);
signal = signal(:).';
for i=1:l
if i==1 %for signal index of 1, alpha is 1/sqrt(l)
alpha=sqrt(1/l);
else %for signal index of greater than 1
alpha=sqrt(2/l);
end
j=[1:l];
% summation calculates single entry of res by applying the
% formula of DCT on the signal
%// Change
summation=sum(signal.*cos((pi*(2*(j-1)+1).*(i-1))/(2*l)));
res(i)=alpha*summation;
end
end
关于matlab - 使用一维 DCT 的二维离散余弦变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29389521/
我正在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++)
我是一名优秀的程序员,十分优秀!