标签: dct

如何在R中执行*Fast*DCT(离散余弦变换)?

使用Rprof显示dtt包中的dct是一段运行速度非常慢的R代码中的主要攻击者.在stats包中交换它为fft(这不是相同的转换,但应该花费相同的时间来计算)我的运行时间显着改善.事实上,我的Rprof线路中有2/3是先前的dct呼叫,而且在进行切换后仅有3行约600个fft呼叫.

dtt包中的dct实现是不是使用快速离散傅立叶变换完成的?如果是这样,是否有一个包有一个?(我知道可以将数据加倍,然后从那些fft系数中提取dct的系数,但是直接的快速dct肯定会更好,并且确实应该在某个地方).

r fft dct

6
推荐指数
1
解决办法
4539
查看次数

使用Python的Scipy DCT-II进行2D或ND DCT

我想使用scipy的DCT-II,因为它已经编码并且速度很快.看一下这个文档,它似乎是一维实现.是否可以以这种方式使用它作为3D实现?我不确定数学.2D和3D实现相当于在计算中使用不同尺寸乘以1D的2或3倍?

python dct scipy

6
推荐指数
1
解决办法
2441
查看次数

寻找 8x8(或 nxn)离散余弦变换 (DCT)/IDCT 伪代码

我已经在 Google 上搜索了一段时间,想找到一个相当高效的 8x8(或 nxn)DCT 算法的伪代码,但我找不到任何东西!

我采用了幼稚的方法,并且执行起来花费了太长时间。

如果您可以发布一些伪代码或参考一本好书/文档/网站,那将会很有帮助。

C 或 C++ 示例会更好!

c++ algorithm dct

5
推荐指数
1
解决办法
1万
查看次数

快速 DCT 变换

JPEG压缩过程中生成DCT系数的标准方程为DCT公式:

我知道这个实现很昂贵(慢),而且有更快的方法。这种生成 DCT 系数的更快方法是否有明确的公式?

compression algorithm jpeg image-processing dct

5
推荐指数
2
解决办法
4052
查看次数

图像的离散余弦变换(DCT)

我在Matlab中使用一个函数来计算图像的DCT(离散余弦变换).我不知道我的代码中有什么不起作用,但我得到了一个具有相同编号的输出图像.我想在DCT中使用这个公式.

请任何想法.

    function image_comp = dctII(image, b)
    [h w] = size(image);
    image = double(image) - 128;
    block = zeros(b,b);

 image_t=zeros(size(image));
 for k=1:b:h
     for l=1:b:w
        image_t(k:k+b-1,l:l+b-1)= image(k:k+b-1,l:l+b-1);
        for u=1:b
            for v=1:b
                if u == 0
                    Cu = 1/sqrt(2);
                else
                    Cu = 1;
                end
                if v == 0
                    Cv = 1/sqrt(2);
                else
                    Cv = 1;
                end
                Res_sum=0;
                for x=1:b;
                    for y=1:b
                        Res_sum = Res_sum + ((image_t(x,y))*cos(((2*x)+1)*u*pi/(2*b))*cos(((2*y)+1)*v*pi/(2*b)));  
                    end
                end
                dct= (1/4)*Cu*Cv*Res_sum;
                block(u,v) = dct;

            end
        end
        image_comp(k:k+b-1,l:l+b-1)=block(u,v);
     end
 end
end
Run Code Online (Sandbox Code Playgroud)

matlab image dct

5
推荐指数
1
解决办法
1万
查看次数

我正在寻找一种用于矩阵 [NxM] 的快速 DCT 和 IDCT 的简单算法

我正在寻找一种简单的算法来执行任意大小 [NxM] 矩阵的快速DCT(类型 2),以及一种用于逆变换IDCT(也称为 DCT 类型 3)的算法。

我需要一个 DCT-2D 算法,但即使是 DCT-1D 算法也足够好,因为我可以使用 DCT-1D 来实现 DCT-2D(和 IDCT-1D 来实现 IDCT-2D )。

PHP 代码更可取,但任何足够清晰的算法都可以。

当矩阵大小超过 [200x200] 时,我当前用于实现 DCT/IDCT 的 PHP 脚本非常慢。

我一直在寻找一种方法,可以在不到 20 秒的时间内完成高达 [4000x4000] 的 DCT。有谁知道怎么做?

algorithm performance mathematical-optimization dct

5
推荐指数
1
解决办法
6098
查看次数

更改 ImageHash Python 库中的哈希大小

我正在使用ImageHash库来生成图像的感知哈希。该库声称能够生成不同大小的哈希值(64、128、256),但我不知道如何获得 128 哈希值。

哈希大小由库重新缩放时的图像大小决定,例如:

def average_hash(image, hash_size=8):
    image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
Run Code Online (Sandbox Code Playgroud)

这里的默认值为 8(8x8 图像 = 64 像素 -> 灰度 -> 64 位)。

然而,128 位哈希值是如何创建的呢?

第二件事,pHash 的默认大小是 32,如此处所述但稍后将仅计算左上角 8x8 部分的 DCT,因此又是 64 位。DCT 的计算方法为scipy.fftpack

def phash(image, hash_size=32):
    image = image.convert("L").resize((hash_size, hash_size), Image.ANTIALIAS)
    pixels = numpy.array(image.getdata(), dtype=numpy.float).reshape((hash_size, hash_size))
    dct = scipy.fftpack.dct(pixels)
    dctlowfreq = dct[:8, 1:9]
    avg = dctlowfreq.mean()
    diff = dctlowfreq > avg
    return ImageHash(diff)
Run Code Online (Sandbox Code Playgroud)

如何更改哈希大小?
无论使用哪个值,计算将始终基于左上角 8x8,因此始终为 64!

发生的奇怪的事情是,如果我从 8 大小的 pHash 开始(从头开始调整图像大小),我得到 56 …

python hash dct scipy phash

5
推荐指数
1
解决办法
3852
查看次数

DCT压缩 - 块大小,选择系数

我试图了解块大小的影响和选择DCT压缩系数的最佳策略.基本上我想问一下我在这里写的内容:

视频压缩:什么是离散余弦变换?

让我们假设最原始的压缩.制作图像块.在每个博客上执行DCT并清零一些系数.

根据我的理解,块越小越好.较小的块意味着像素更相关,因此DCT光谱中的能量更"紧凑".在快速变化的图像(高频)中应该更加强调.

假设我们将一定百分比的系数归零,那么什么会产生最佳图像质量,小块或大块?假设我们保持10%,25%,50%,75%,你会说这是不同百分比的不同答案吗?

另一个问题是如何选择不受影响的系数.我要说我必须根据地点而不是能源做出决定.你会从左上角拿一个方格吗?我已经在DCT频谱中平均了很多块,并得出结论最好的是从左上角取三角形.你怎么看?

希望我们能够进行有效的讨论.

compression signal-processing image-processing dct

4
推荐指数
1
解决办法
4966
查看次数

Scipy的fftpack dct和idct

假设您使用dct函数,然后不对数据进行操作并使用反转变换; 倒置数据不会与预转换数据相同吗?为什么浮点问题?是报告的问题还是正常行为?

In [21]: a = [1.2, 3.4, 5.1, 2.3, 4.5]

In [22]: b = dct(a)

In [23]: b
Out[23]: array([ 33.        ,  -4.98384545,  -4.5       ,  -5.971707  ,   4.5       ])

In [24]: c = idct(b)

In [25]: c
Out[25]: array([ 12.,  34.,  51.,  23.,  45.])
Run Code Online (Sandbox Code Playgroud)

任何人都有解释为什么?当然,一个简单的c*10**-1方法可以解决这个问题,但是如果你重复调用函数来在几个维度上使用它,那么错误就会变大:

In [37]: a = np.random.rand(3,3,3)

In [38]: d = dct(dct(dct(a).transpose(0,2,1)).transpose(2,1,0)).transpose(2,1,0).transpose(0,2,1)

In [39]: e = idct(idct(idct(d).transpose(0,2,1)).transpose(2,1,0)).transpose(2,1,0).transpose(0,2,1)

In [40]: a
Out[40]: 
array([[[ 0.48709809,  0.50624831,  0.91190972],
        [ 0.56545798,  0.85695062,  0.62484782],
        [ 0.96092354,  0.17453537,  0.17884233]],

       [[ …
Run Code Online (Sandbox Code Playgroud)

python dct scipy fftpack

4
推荐指数
1
解决办法
5400
查看次数

使用 1D DCT 的 2D 离散余弦变换

我正在尝试使用 1D DCT 运算对图像实施 2D 离散余弦变换。如果我将其与dct2MATLAB 函数进行比较,我的输出是不正确的。我不明白我的代码出了什么问题以及发生在哪里。

如果有人可以指出错误或任何其他建议,那将非常有帮助。

这是我用 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 …
Run Code Online (Sandbox Code Playgroud)

matlab signal-processing image-processing dct

4
推荐指数
1
解决办法
5817
查看次数