opencv3/C++ 离散余弦变换DCT方式

 更新时间:2019年12月11日 09:53:19   作者:阿卡蒂奥  
今天小编就为大家分享一篇opencv3/C++ 离散余弦变换DCT方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

离散余弦变换/Discrete cosine transform,

根据离散傅里叶变换的性质,实偶函数的傅里叶变换只含实的余弦项,而数字图像都是实数矩阵,因此构造了一种实数域的变换——离散余弦变换(DCT)。

离散余弦变换具有很强的”能量集中”特性,左上方称为低频数据,右下方称为高频数据。而大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分。因此也可以在图像压缩算法中用来进行有损压缩。(如JPEG压缩编码)

OpenCV中dct()

在OpenCV中有专门进行离散余弦变换的函数dct()。

dct()函数执行1D或2D浮点数组的正向或反向离散余弦变换(DCT):

N个元素的一维向量的正余弦变换:

该函数通过查看输入数组的标志和大小来选择操作模式:

如果(flags&DCT_INVERSE)== 0,则函数执行向前的1D或2D变换。否则是一个逆1D或2D变换。

如果(flags&DCT_ROWS)!= 0,则函数执行每行的一维变换。

如果数组是单列或单行,则该函数执行一维变换。

如果以上都不是,则该函数执行2D变换。

目前dct支持偶数大小的数组(2,4,6 …)。对于数据分析和逼近,可以在必要时填充数组。另外,函数性能对数组大小的依赖性非常大,而不是单调的。在当前实现中,大小为N的矢量的DCT通过大小为N / 2的矢量的DFT来计算。因此,最佳DCT大小N1 > = N可以计算为:

size_t getOptimalDCTSize(size_t N){return 2 * getOptimalDFTSize((N + 1)/ 2); }
N1 = getOptimalDCTSize(N);

dct()参数

src 输入浮点数组。

dst 输出与src大小和类型相同的数组。

flags 转换标志

opencv示例

#include <opencv2\opencv.hpp> 
#include <opencv2\core\core.hpp>
#include <opencv2\core\mat.hpp>
#include <iostream> 
using namespace std; 
using namespace cv; 
int main()
{
 Mat src = imread("E:\\image\\sophie.jpg", 0); 
 if(src.empty())
 {
  cout << "the image is not exist" << endl; 
  return -1;
 }
 resize(src, src, Size(512, 512));
 src.convertTo(src, CV_32F, 1.0/255);
 Mat srcDCT; 
 dct(src, srcDCT);

 imshow("src", src);
 imshow("dct", srcDCT);
 waitKey();
 return 0;
}

可以看到因为第一幅图像的细节较少,因此DFT变换数据主要集中在左上方(低频区域),高频区域大部分为0:

而第二幅图像相对而言具有较为丰富的细节,因此相对于第一幅图像中间区域出现了大量的非0值:

以上这篇opencv3/C++ 离散余弦变换DCT方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言实现停车场项目

    C语言实现停车场项目

    这篇文章主要为大家详细介绍了C语言实现停车场项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • c++中vector的使用和模拟实现

    c++中vector的使用和模拟实现

    这篇文章主要介绍了c++中vector的使用和模拟实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C语言 socketpair用法案例讲解

    C语言 socketpair用法案例讲解

    这篇文章主要介绍了C语言 socketpair用法案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++ OpenCV实战之制作九宫格图像

    C++ OpenCV实战之制作九宫格图像

    本文将为大家介绍如何使用OpenCV C++ 制作九宫格图像,即将一张图像均等分成九份,然后将这九个小块按一定间隔拷贝到新画布上就可以啦。感兴趣的可以动手试一试
    2022-01-01
  • C++ 操作系统内存分配算法的实现详解

    C++ 操作系统内存分配算法的实现详解

    本文主要介绍了在动态分区管理方式下采用不同的分配算法实现主存分配和实现主存回收,旨在帮助学生理解在动态分区管理方式下应怎样实现主存空间的分配和回收。感兴趣的可以了解一下
    2021-11-11
  • C++ 如何判断四个点是否构成正方形

    C++ 如何判断四个点是否构成正方形

    这篇文章主要介绍了C++ 如何判断四个点是否构成正方形的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • c++中堆栈及创建对象示例代码

    c++中堆栈及创建对象示例代码

    这篇文章主要给大家详细介绍了c++如何实现堆栈及创建对象,文中先进行了简单的介绍,而后给出了详细的示例代码及注释,相信对大家的理解和学习很有帮助,有需要的朋友们下面跟着小编一起来学习学习吧。
    2016-12-12
  • Qt使用QWT绘制柱状图详解

    Qt使用QWT绘制柱状图详解

    QT中提供了一个叫做QWT的库。QWT,全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可生成各种统计图。本文将通过它绘制柱状图,需要的可以参考一下
    2022-01-01
  • 枚举窗口句柄后关闭所有窗口示例

    枚举窗口句柄后关闭所有窗口示例

    这篇文章主要介绍了关闭所有窗口的方法,原理是枚举所有窗口句柄,然后发送WM_CLOSE消息来关闭窗口,需要的朋友可以参考下
    2014-01-01
  • 离线安装visual studio2022+QT5.12的实现步骤

    离线安装visual studio2022+QT5.12的实现步骤

    近期有需求离线配置C++与QT环境,本文主要介绍了离线安装visualstudio2022+QT5.12的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06

最新评论