基于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 ...
随机推荐
- RandomAccessFile java
RandomAccessFile 用来支持读写随机存取文件的类.提供“文件指针”,类似于游标和下标,使用getFilePointer()方法获得,利用seek()方法设置下标. public Rand ...
- Redis安装——在CentOS7下的安装
参考自:https://linux.cn/article-6719-1.html 一.安装 首先通过xshell5先登陆来到字符界面(xshell通过SSH连接请参见之前随笔) 先下载redis,这里 ...
- 20155338 2016-2017-2 《Java程序设计》第10周学习总结
20155338 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 · 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事 ...
- 20155339 2016-2017-2 《Java程序设计》第3周学习总结
20155339 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 类与对象 1.定义类时使用class关键词再加名称,例如 class Cl ...
- day7 opencv+python 读取视频,没有东西
1.读取视频man.avi, 报错. 我的视频和文件在同一目录下. #coding=utf-8 import numpy as np import cv2 cap = cv2.VideoCapture ...
- 八月暑期福利,10本Python热门书籍免费送!
八月第一周,网易云社区联合博文视点为大家带来Python专场送书福利,10本关于Python的书籍内容涉及Python入门.绝技.开发.数据分析.深度学习.量化投资等.以下为书籍简介,送书福利请见文末 ...
- 身份证扫描识别/身份证OCR识别的正确姿势,你get到了吗?
自从国家规定电信实名制之后,实名制已经推广到各个领域:办理通信业务需要实名制.银行开户需要实名制.移动支付需要实名制,就连注册个自媒体账户都需要实名制. 而实名制的背后,就是身份证信息的采集和录入验证 ...
- SpringBoot (1) idea下的环境搭建及demo
1.Spring Boot简介 wiki上的介绍: Spring Boot是Spring的常规配置解决方案,用于创建可以“运行”的独立的,生产级的基于Spring的应用程序.[22]它预先配置了Spr ...
- request,logging,ConfigParser——接口框架
做一个将参数和用例分开放置,并且输出log的接口测试框架 我的框架如下所示 Log文件用来设置log输出文件,需要时可以在用例内调用输出,config用来填写一切需要的参数信息,jiekou_post ...
- Unity利用Share SDK实现QQ、微信及微博第三方登录及定制内容分享(附代码)
最近因为公司的项目需要添加一些实用性的功能,需要添加第三方登录及分享,采用的是Mob的SDK,可以先到其官网下载对应的SDK 点击这里,为了方便后期进行数据统计和分析,所以可以先添加一个应用,添加成功 ...