基于opencv的小波变换代码和图像结果

  1 #include "stdafx.h"
  2 #include "WaveTransform.h"
  3 #include <math.h>
  4 #include <imgproc/imgproc.hpp>

  5 Mat WaveTransform::WDT(const Mat &_src,const string _wname,const int _level)
  6 {
  7     Mat src=Mat_<float>(_src);
  8     Mat dst=Mat::zeros(src.rows,src.cols,src.type());
  9     int N=src.rows;
 10     int D=src.cols;
 11     //高通低通滤波器
 12     Mat lowFilter;
 13     Mat highFilter;
 14     wavelet(_wname,lowFilter,highFilter);
 15     //小波变换
 16     int t=1;
 17     int row=N;
 18     int col=D;
 19     while (t<=_level)
 20     {
 21         //先进行 行小波变换
 22         for (int i=0;i<row;i++)
 23         {
 24             //取出src中要处理的数据的一行
 25             Mat oneRow=Mat::zeros(1,col,src.type());
 26             for (int j=0;j<col;j++)
 27             {
 28                 oneRow.at<float>(0,j)=src.at<float>(i,j);
 29             }
 30             oneRow=waveletDecompose(oneRow,lowFilter,highFilter);
 31             for (int j=0;j<col;j++)
 32             {
 33                 dst.at<float>(i,j)=oneRow.at<float>(0,j);
 34             }
 35         }
 36         char s[10];
 37         itoa(t,s,10);
 38         imshow(s,dst);
 39         waitKey();
 40 #if 0
 41     //    normalize(dst,dst,0,255,NORM_MINMAX);
 42         IplImage dstImg1=IplImage(dst);
 43         cvSaveImage("dst1.jpg",&dstImg1);
 44 #endif
 45
 46         //小波列变换
 47         for (int j=0;j<col;j++)
 48         {
 49             Mat oneCol=Mat::zeros(row,1,src.type());
 50             for (int i=0;i<row;i++)
 51             {
 52                 oneCol.at<float>(i,0)=dst.at<float>(i,j);//dst,not src
 53             }
 54             oneCol=(waveletDecompose(oneCol.t(),lowFilter,highFilter)).t();
 55             for (int i=0;i<row;i++)
 56             {
 57                 dst.at<float>(i,j)=oneCol.at<float>(i,0);
 58             }
 59         }
 60 #if 0
 61         //    normalize(dst,dst,0,255,NORM_MINMAX);
 62         IplImage dstImg2=IplImage(dst);
 63         cvSaveImage("dst2.jpg",&dstImg2);
 64 #endif
 65         //更新
 66         row/=2;
 67         col/=2;
 68         t++;
 69         src=dst;
 70
 71     }
 72     return dst;
 73 }
 74
 75 //生成不同类型的小波
 76 void WaveTransform::wavelet( const string _wname, Mat &_lowFilter, Mat &_highFilter )
 77 {
 78
 79     if (_wname=="haar" || _wname=="db1")
 80     {
 81         int N=2;
 82         _lowFilter=Mat::zeros(1,N,CV_32F);
 83         _highFilter=Mat::zeros(1,N,CV_32F);
 84
 85         _lowFilter.at<float>(0,0)=1/sqrtf(N);
 86         _lowFilter.at<float>(0,1)=1/sqrtf(N);
 87
 88         _highFilter.at<float>(0,0)=-1/sqrtf(N);
 89         _highFilter.at<float>(0,1)=1/sqrtf(N);
 90     }
 91     if (_wname=="sym2")
 92     {
 93         int N=4;
 94         float h[]={-0.483, 0.836, -0.224, -0.129};
 95         float l[]={-0.129, 0.224,    0.837, 0.483};
 96
 97         _lowFilter=Mat::zeros(1,N,CV_32F);
 98         _highFilter=Mat::zeros(1,N,CV_32F);
 99
100         for (int i=0;i<N;i++)
101         {
102             _lowFilter.at<float>(0,i)=l[i];
103             _highFilter.at<float>(0,i)=h[i];
104         }
105     }
106
107 }
108
109 //小波分解
110 Mat WaveTransform::waveletDecompose( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )
111 {
112     assert(_src.rows==1 && _lowFilter.rows==1 && _highFilter.rows ==1);
113     assert(_src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );
114     Mat &src=Mat_<float>(_src);
115
116     int D=src.cols;
117
118     Mat &lowFilter=Mat_<float>(_lowFilter);
119     Mat &highFilter=Mat_<float>(_highFilter);
120
121     //频域滤波或时域卷积;ifft( fft(x) * fft(filter)) = cov(x,filter)
122     Mat dst1=Mat::zeros(1,D,src.type());
123     Mat dst2=Mat::zeros(1,D,src.type());
124
125     filter2D(src,dst1,-1,lowFilter);
126     filter2D(src,dst2,-1,highFilter);
127
128     //下采样
129     Mat downDst1=Mat::zeros(1,D/2,src.type());
130     Mat downDst2=Mat::zeros(1,D/2,src.type());
131
132     resize(dst1,downDst1,downDst1.size());
133     resize(dst2,downDst2,downDst2.size());
134
135     //数据拼接
136     for (int i=0;i<D/2;i++)
137     {
138         src.at<float>(0,i)=downDst1.at<float>(0,i);
139         src.at<float>(0,i+D/2)=downDst2.at<float>(0,i);
140
141     }
142     return src;
143 }

用main函数调用WDT

Mat imgWave=m_waveTransform.WDT(src,"haar",3);
imshow("img",Mat_<uchar>(imgWave));
waitKey();

用一张考拉图来分析小波变换过程:

原图:

3层小波变换结果图(图片有压缩):

下面逐一分析:

1 只做完小波行变换

2 行列变换

3 再次行变换

4 再次行列变换

三次之后到最后的分解图。

代码来自:http://shijuanfeng.blogbus.com/logs/221385402.html

时间: 2024-10-11 05:40:59

基于opencv的小波变换代码和图像结果的相关文章

基于opencv的小波变换

基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的倍数:2层变换:w,h必须是4的倍数:3层变换:w,h必须是8的倍数......),变换后的结果直接保存在输入图像中.1.函数参数简单,图像指针pImage和变换层数nLayer.2.一个函数直接完成多层次二维小波变换,尽量减少下标运算,避免不必要的函数调用,以提高执行效率.3.变换过程中,使用了一

基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiDU全景"这样的全部的或者部分的实际场景的重新回放. 对于图像拼接的流程有很多定义方式,本教程中主要介绍实现主流方法,总结梳理如下: 图像采集->投影变换->特征点匹配->拼接对准->融合->反投影 图像采集不仅仅指的是普通的图像数据的获取.为了能够拼接过程能够顺利进行.

基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)

基于opencv和mfc的摄像头采集框架(GOMFCTemplate2) 编写带界面的图像处理程序,选择opencv+mfc是一种很好的选择:在读取摄像头数据方面,网上的方法很多,其中shiqiyu的camerads的方法是较好的. 基于现有资料,通过在实际项目中的积累,我总结出来一套结合opencv和mfc的摄像头采集框架.具有以下特点: 1.基于directshow,兼容性好,速度快.到目前为止,无论是工业相机还是普通相机,没发现不兼容的: 2.摄像头部分通过线程读取,保证界面的运行流畅:

Java基于opencv实现图像数字识别(一)

Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用BufferedImage这个类进行操作:尝试着做了一下,做到灰度化,和二值化就做不下去了:然后几乎就没有啥java的资料了,最多的好像都是c++,惹不起.惹不起...... 我也想尝试着用c++做一下,百度到了c++基于opencv来做图像识别的:但是要下vs啊,十几个g呢,我内存这么小,配置这么麻烦,而且vs

Java基于opencv实现图像数字识别(二)—基本流程

Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要是表格中数字的识别,但这个不是重点.重点是通过这个我们可以举一反三,来实现我们自己的业务. 图像的识别主要分为两步:图片预处理和图像识别:这两步都很重要 图像预处理: 1. 图像灰度化:二值化 2. 图像降噪,去除干扰线 3. 图像腐蚀.膨胀处理 4. 字符分割 5. 字符归一化 图像识别: 1.

基于OpenCV的图片卡通化处理

学习OpenCV已有一段时间,除了研究各种算法的内容,在空闲之余,根据书本及资料的引导,尝试结合图像处理算法和日常生活联系起来,首先在台式机上(带摄像头)完成一系列视频流处理功能,开发平台为Qt5.3.2+OpenCV2.4.9. 本次试验实现的功能主要有: 调用摄像头捕获视频流: 将帧图像转换为素描效果图片: 将帧图像卡通化处理: 简单地生成"怪物"形象: 人脸肤色变换. 本节所有的算法均由类cartoon中的函数cartoonTransform()来实现: // Frame:输入每

【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析

了解过之前老版本OpenCV的童鞋们都应该清楚,对于OpenCV1.0时代的基于 C 语言接口而建的图像存储格式IplImage*,如果在退出前忘记release掉的话,就会造成内存泄露.而且用起来超级麻烦,我们往往在debug的时候,很大一部分时间在纠结手动释放内存的问题.虽然对于小型的程序来说手动管理内存不是问题,但一旦我们写的代码变得越来越庞大,我们便会开始越来越多地纠缠于内存管理的问题,而不是着力解决你的开发目标. 这,就有些舍本逐末的感觉了. 而自从OpenCV踏入2.0时代,用Mat

用OpenCV实现Photoshop算法(一): 图像旋转

最近学习了OpenCV,于是想用它实现Photoshop的主要功能,用于照片处理. 对于一张照片,PS的一般处理步骤包括: 1, 旋转图片,校正位置. 2,剪切,调整大小,重新构图. 3,调整色阶.曲线,使图片曝光正确.对比适中. 4,调整对比度.饱和度 5,印章去掉不想要的东西,液化调整形体线条 6,对于人像图片,美肤.美白 7, 用色彩平衡.可选颜色等调整色调,形成照片调性 8,加一些光效 9,锐化 以后的一系列博文将采用OpenCV逐一实现Photoshop的算法和功能, 并用计算机视觉人

基于 OpenCV 的人脸识别

基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有 OpenCV 的身影. OpenCV 起始于 1999 年 Intel 的一个内部研究项目.从那时起,它的开发就一直很活跃.进化到现在,它已支持如 OpenCL 和 OpenGL 的多种现代技术,也支持如 iOS