用于32x32矩阵的BinDCT实现

时间:2014-01-11 21:19:44

标签: c# algorithm math matrix dct

所以我正在玩DCT实现,并注意到由于必要的乘数计算它们(相对)慢。

在谷歌搜索后,我遇到了BinDCT,这导致了DCT的非常好的近似,并且只使用了位移。

在扫描关于它的论文(http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.834&rep=rep1&type=pdfhttp://www.docstoc.com/docs/130118150/Image-Compression-Using-BinDCT)并阅读我在ohlo(http://code.ohloh.net/file?fid=vz-HijUWVLFS65NRaGZpLZwZFq8&cid=mt_ZjvIU0Us&s=&fp=461906&projSelected=true#L0)上找到的一些代码时,我注意到只有8x8矩阵的实现。< / p>

我正在为32x32矩阵寻找这个BinDCT的实现,所以我可以在感知哈希算法(phash)的更快变化中使用它。

我不是数学家,虽然我试图理解论文和c代码中发生了什么,但我发现我无法解决如何将此实现转换为应用于32x32矩阵的问题。

有没有人写过一个?它甚至可能吗?

据我所知,扩展实现需要更多的位移和tmp变量。但是虽然我可以尝试反复试验,但我甚至不理解这个理论,所以我永远不会知道我是否得到了正确的结果。

我是用C#编写的,但任何语言都可以,因为它是所有基本操作,并且可以轻松翻译。

2 个答案:

答案 0 :(得分:1)

1.您有固定的输入大小

  • 所以你总是乘以相同的权重
  • 预先计算一次,然后只使用它们
  • 这个沟渠全部犯罪,cos操作

2.2D DCT可以计算为1D DCT(类似于FFT)

  • 首先在行上进行DCT
  • 然后在DCTed行的列上
  • 乘以归一化常数
  • 所以这将O(N ^ 4)转换为O(N ^ 3)

3.使用FastDCT

  • 这是非常棘手的
  • 快速算法是(I)DST和(I)DCT
  • 之间的融合
  • 关于它的论文很少
  • 但有模糊(所有方程式在不同的论文中都不同而不是完整的)
  • 我实际上更新看到功能方程式或程序
  • 唯一几乎功能性的方法是使用FFT
  • 但是对于小N而言,由于切换到复杂域而没有增益
  • 并且这些值实际上不是DCT,而是与它非常接近。
  • 当然我不是专家,所以我可以忽略一些事情
  • 所有数百页纸方程式
  • 无论如何在快速算法实现2D(I)DCT和子弹2
  • 之后
  • 是O((N ^ 2).log(N))
  • 的复杂性

4.抛弃FPU乘法

  • 您可以获取所有权重并将其转换为a1 = a0 * 1024
  • 或任何其他面具
  • 这样:

    x*a0 = (x*a1)/1024 = (x*a1)>>10
    
  • 输入数据可以做同样的事情

  • 所以现在只剩下整数操作
  • 但在现代机器上,这种方法可能比FPU使用慢(取决于平台和实现)

4.ditching整数乘法

  • 你可以通过移位和添加操作(寻找二进制乘法)来抛弃所有乘法
  • 但在现代机器上,这实际上会减慢速度
  • 当然,如果你在某些逻辑板/ IO上接线,那么它有其优点

答案 1 :(得分:0)

我对应用矩阵的唯一理解与操纵3D矢量有关,所以我不直接知道你问题的答案。但在环顾四周时,我确实找到了这个链接到博客,其中解决了您的具体问题。底部的评论来自一群人,这些人可能是一个很好的资源池,可以与在该领域有相关知识的人聊天。此外,如果您按照链接有很多良好的图像压缩信息。

作者似乎大量参与照片取证。他解释了pHash如何比平均散列更稳健,并提到使用32 x 32矩阵。

这可能是一个非常好的起点。小心。

http://www.hackerfactor.com/blog/?/archives/432-Looks-Like-It.html