版权声明:本文为博主原创文章,转载时请注明来源。有问题请e-mail:mr.baishu@gmail.com https://blog.csdn.net/u011177305/article/details/51313718 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div class="htmledit_views" id="content_views">
-
</pre><pre name=
"code" class=
"cpp"><p><span style=
"font-family:KaiTi_GB2312;font-size:14px;">看完小波变换的理论后想实现一线,同时发现opencv中并没有小波变换的函数(还是新版的有了,我不知道啊,please give Me a feedback
if U guy know)</span></p><p>...............省略线。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。</p><p>
int N =
16;</p>
//该部分首先将图划分为16*16的block区域
-
//在每一个循环当中,在每一次循环的所有的操作中,都表示在一个block的操作
-
//其中包括一次小波变换得到四个区域
-
//一次空间Spatial Energy计算,将每个Block的能量块保存到EnergyBlock([8,8]大小)中
-
//并且将这些能量块的数值保存为vector作为SVM的训练样本
-
for (
int x=
0;x<inputImage.rows;x+=N)
-
{
-
Mat ROIBlock = inputImage(Range(x,x+N),Range(x,x+N));
-
-
//小波变换:
-
//waveletblockLH为LH列变换后的结果
-
//waveletblock为waveletblock的LH行变换的结果
-
Mat WaveletBlockLH=Mat::zeros(
16,
16, ROIBlock.type());
-
Mat WaveletBlock=Mat::zeros(
16,
16, ROIBlock.type());
-
Mat EnergyBlock = Mat::zeros(
8,
8,ROIBlock.type());
-
-
//计算
-
for (
int i=
0,j=
0;j<ROIBlock.cols;i+=
2,j++)
-
{
-
//判断是否为前八列,如果成立则
-
// j=.i+.(i+1)
-
//否则:j=.(i-8)-.(i+1-8)
-
if (
floor(j /
8) ==
0)
-
{
-
-
WaveletBlockLH.col(j) = ROIBlock.col(i) + ROIBlock.col(i +
1);
-
}
-
else
-
-
WaveletBlockLH.col(j)=ROIBlock.col(i-N)-ROIBlock.col(i-N+
1);
-
-
}
-
-
for (
int i =
0,j =
0; j<WaveletBlockLH.rows; i +=
2, j++)
-
{
-
//判断是否为前八列,如果成立则
-
// j=.i+.(i+1)
-
//否则:j=.(i-8)-.(i+1-8)
-
if (
floor(j /
8) ==
0)
-
{
-
-
WaveletBlock.row(j) = WaveletBlockLH.row(i) + WaveletBlockLH.row(i +
1);
-
}
-
else
-
-
WaveletBlock.row(j) = WaveletBlockLH.row(i - N) - WaveletBlockLH.row(i - N+
1);
-
-
}