基于opencv的小波变换代码和图像结果
#include "stdafx.h"
#include "WaveTransform.h"
#include <math.h>
#include <imgproc/imgproc.hpp> Mat WaveTransform::WDT(const Mat &_src,const string _wname,const int _level)
{
Mat src=Mat_<float>(_src);
Mat dst=Mat::zeros(src.rows,src.cols,src.type());
int N=src.rows;
int D=src.cols;
//高通低通滤波器
Mat lowFilter;
Mat highFilter;
wavelet(_wname,lowFilter,highFilter);
//小波变换
int t=;
int row=N;
int col=D;
while (t<=_level)
{
//先进行 行小波变换
for (int i=;i<row;i++)
{
//取出src中要处理的数据的一行
Mat oneRow=Mat::zeros(,col,src.type());
for (int j=;j<col;j++)
{
oneRow.at<float>(,j)=src.at<float>(i,j);
}
oneRow=waveletDecompose(oneRow,lowFilter,highFilter);
for (int j=;j<col;j++)
{
dst.at<float>(i,j)=oneRow.at<float>(,j);
}
}
char s[];
itoa(t,s,);
imshow(s,dst);
waitKey();
#if 0
// normalize(dst,dst,0,255,NORM_MINMAX);
IplImage dstImg1=IplImage(dst);
cvSaveImage("dst1.jpg",&dstImg1);
#endif //小波列变换
for (int j=;j<col;j++)
{
Mat oneCol=Mat::zeros(row,,src.type());
for (int i=;i<row;i++)
{
oneCol.at<float>(i,)=dst.at<float>(i,j);//dst,not src
}
oneCol=(waveletDecompose(oneCol.t(),lowFilter,highFilter)).t();
for (int i=;i<row;i++)
{
dst.at<float>(i,j)=oneCol.at<float>(i,);
}
}
#if 0
// normalize(dst,dst,0,255,NORM_MINMAX);
IplImage dstImg2=IplImage(dst);
cvSaveImage("dst2.jpg",&dstImg2);
#endif
//更新
row/=;
col/=;
t++;
src=dst; }
return dst;
}
//生成不同类型的小波
void WaveTransform::wavelet( const string _wname, Mat &_lowFilter, Mat &_highFilter )
{ if (_wname=="haar" || _wname=="db1")
{
int N=;
_lowFilter=Mat::zeros(,N,CV_32F);
_highFilter=Mat::zeros(,N,CV_32F); _lowFilter.at<float>(,)=/sqrtf(N);
_lowFilter.at<float>(,)=/sqrtf(N); _highFilter.at<float>(,)=-/sqrtf(N);
_highFilter.at<float>(,)=/sqrtf(N);
}
if (_wname=="sym2")
{
int N=;
float h[]={-0.483, 0.836, -0.224, -0.129};
float l[]={-0.129, 0.224, 0.837, 0.483}; _lowFilter=Mat::zeros(,N,CV_32F);
_highFilter=Mat::zeros(,N,CV_32F); for (int i=;i<N;i++)
{
_lowFilter.at<float>(,i)=l[i];
_highFilter.at<float>(,i)=h[i];
}
} }
//小波分解
Mat WaveTransform::waveletDecompose( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )
{
assert(_src.rows== && _lowFilter.rows== && _highFilter.rows ==);
assert(_src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );
Mat &src=Mat_<float>(_src); int D=src.cols; Mat &lowFilter=Mat_<float>(_lowFilter);
Mat &highFilter=Mat_<float>(_highFilter); //频域滤波或时域卷积;ifft( fft(x) * fft(filter)) = cov(x,filter)
Mat dst1=Mat::zeros(,D,src.type());
Mat dst2=Mat::zeros(,D,src.type()); filter2D(src,dst1,-,lowFilter);
filter2D(src,dst2,-,highFilter); //下采样
Mat downDst1=Mat::zeros(,D/,src.type());
Mat downDst2=Mat::zeros(,D/,src.type()); resize(dst1,downDst1,downDst1.size());
resize(dst2,downDst2,downDst2.size()); //数据拼接
for (int i=;i<D/;i++)
{
src.at<float>(,i)=downDst1.at<float>(,i);
src.at<float>(,i+D/)=downDst2.at<float>(,i); }
return src;
}
用main函数调用WDT
Mat imgWave=m_waveTransform.WDT(src,"haar",);
imshow("img",Mat_<uchar>(imgWave));
waitKey();
用一张考拉图来分析小波变换过程:
原图:
3层小波变换结果图(图片有压缩):
下面逐一分析:
1 只做完小波行变换
2 行列变换
3 再次行变换
4 再次行列变换
三次之后到最后的分解图。
代码来自:http://shijuanfeng.blogbus.com/logs/221385402.html
基于opencv的小波变换代码和图像结果的更多相关文章
- 基于opencv的小波变换
基于opencv的小波变换 提供函数DWT()和IDWT(),前者完成任意层次的小波变换,后者完成任意层次的小波逆变换.输入图像要求必须是单通道浮点图像,对图像大小也有要求(1层变换:w,h必须是2的 ...
- Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...
- 图像矫正-基于opencv实现
一.引言 上篇文章中四种方法对图像进行倾角矫正都非常有效.Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块 ...
- 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)
一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
- Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- Java基于opencv实现图像数字识别(一)
Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...
- 基于qml创建最简单的图像处理程序(3)-使用opencv&qml进行图像处理
<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/83 ...
随机推荐
- 20155202 2016-2017-2 《Java程序设计》第1周学习总结
20155202 2016-2017-2 <Java程序设计>第1周学习总结 考核方式于成绩构成 100分构成 翻转课堂考核12次(5*12 = 60):每次考试20-30道题目,考试 ...
- 20155213 2016-2017-2《Java程序设计》课程总结
20155213 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我所期望的师生关系 预备作业2:C语言的学习的回忆 预备作业3:小议linux 第一周作 ...
- WPF中使用WindowChrome自定义窗口中遇到的最大化问题
FrameWork 4.5 之后,内置了WindowChrome类,官方文档: https://msdn.microsoft.com/en-us/library/system.windows.shel ...
- 【LG3973】[TJOI2015]线性代数
[LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...
- SPOJ 694&&SPOJ705: Distinct Substrings
DISUBSTR - Distinct Substrings 链接 题意: 询问有多少不同的子串. 思路: 后缀数组或者SAM. 首先求出后缀数组,然后从对于一个后缀,它有n-sa[i]-1个前缀,其 ...
- django使用流程
1.安装django包 (命令行)>pip install django # conda install django 2.安装成功后,可以新建django项目 1(命令行)>django ...
- HBase第一章 安装 HMaster 主备
1.集群环境 Hadoop HA 集群规划 hadoop1 cluster1 nameNode HMaster hadoop2 cluster1 nameNodeStandby ZooKeeper ...
- 通过redis实现session共享-php
<?php class redisSession{ /** * 保存session的数据库表的信息 */ private $_options = array( 'handler' => n ...
- 搜索引擎ElasticSearch系列(一): ElasticSearch2.4.4环境搭建
一:ElasticSearch简介 Elasticsearch is a distributed, RESTful search and analytics engine capable of sol ...
- Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例
实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ...