///////////////////////////////////////////////////////////////////////////////
//-MWT.H
#pragma once
#include "cv.h"
#include "highgui.h"
using namespace cv;
Mat MWT(Mat img,int nlevs)
{
int halfH = img.rows/2;
int halfW = img.cols/2;
Mat img64f;
img.convertTo(img64f,CV_64F);
Mat temp = Mat(img.rows,img.cols,CV_64F,Scalar::all(0));
for(int n=nlevs;n>0;n--)
{
for(int i=0;i<halfH;i++)
{
for(int j=0;j<halfW;j++)
{
//结构元素B
double b11 = img64f.at<double>(2*i,2*j);
double b12 = img64f.at<double>(2*i,2*j+1);
double b21 = img64f.at<double>(2*i+1,2*j);
double b22 = img64f.at<double>(2*i+1,2*j+1);
double M = (b11+b12+b21+b22)/4;
double Yh = M-0.5*(b11+b12);
double Yv = M-0.5*(b11+b21);
double Yd = M-0.5*(b11+b22);
temp.at<double>(i,j) = M;
temp.at<double>(i,j+halfW) = Yh;
temp.at<double>(i+halfH,j) = Yv;
temp.at<double>(i+halfH,j+halfW) = Yd;
}
}
img64f = temp.clone();
halfW = halfW/2;
halfH = halfH/2;
}
return temp;
}
////////////////////////////////////////////////////////////////////////////
// IMWT.H
#pragma once
#include "cv.h"
#include "highgui.h"
using namespace cv;
// 功能计算法x的n次方
template <class T>
T power( T x, int m)
{
int i; //循环次数
T p=1; //存放结果
for (i=1;i<=m;i++)
p=p*x;
return p;
}
Mat IMWT(Mat img,int nlevs)
{
// 临时矩阵,用于存储矩阵数据
Mat temp = Mat(img.rows,img.cols,CV_64F,Scalar::all(0));
int p = power(2,nlevs);
int iw = img.cols/p;
int ih = img.rows/p;
for(int n= nlevs;n>0;n--)
{
// 获得尺度信号的宽和高
for(int i=0;i<ih;i++)
{
for(int j=0;j<iw;j++)
{
double m = img.at<double >(i,j);
double h = img.at<double >(i,j+iw);
double v = img.at<double >(i+ih,j);
double d = img.at<double >(i+ih,j+iw);
double rm = -(h+v+d);
double rh = -(h-v-d);
double rv = -(v-h-d);
double rd = -(d-h-v);
temp.at<double>(2*i,2*j) = m+rm;
temp.at<double>(2*i,2*j+1) = m+rh;
temp.at<double>(2*i+1,2*j) = m+rv;
temp.at<double>(2*i+1,2*j+1) = m+rd;
}
}
iw = iw*2;
ih = ih*2;
for(int i=0;i<iw;i++)
{
for(int j=0;j<ih;j++)
{
img.at<double>(i,j) = temp.at<double>(i,j);
}
}
}
temp.convertTo(temp,CV_8U,1.0,0.0);
return temp;
}
////////////////////////////////////////////////////////////
#include "MWT.h"
#include "IMWT.h"
#include <iostream>
int main()
{
Mat img = imread("zoneplate.png",0);
namedWindow("zoneplate",1);
imshow("zoneplate",img);
Mat imgdec = Mat(img.rows,img.cols,CV_64F);
int nlev = 3;
imgdec = MWT(img,nlev);
Mat imgdec8u;
imgdec.convertTo(imgdec8u,CV_8U);
namedWindow("imgdec",1);
imshow("imgdec",imgdec8u);
Mat imgrec = Mat(img.rows,img.cols,CV_8U,Scalar::all(0));
imgrec = IMWT(imgdec,nlev);
namedWindow("imgrec",1);
imshow("imgrec",imgrec);
subtract(img,imgrec,img);
Scalar s = mean(img);
std::cout<<s.val[0];
waitKey();
return 0;
}
#include "MWT.h"
#include "IMWT.h"
#include <iostream>
int main()
{
Mat img = imread("zoneplate.png",0);
namedWindow("zoneplate",1);
imshow("zoneplate",img);
Mat imgdec = Mat(img.rows,img.cols,CV_64F);
int nlev = 3;
imgdec = MWT(img,nlev);
Mat imgdec8u;
imgdec.convertTo(imgdec8u,CV_8U);
namedWindow("imgdec",1);
imshow("imgdec",imgdec8u);
Mat imgrec = Mat(img.rows,img.cols,CV_8U,Scalar::all(0));
imgrec = IMWT(imgdec,nlev);
namedWindow("imgrec",1);
imshow("imgrec",imgrec);
subtract(img,imgrec,img);
Scalar s = mean(img);
std::cout<<s.val[0];
waitKey();
return 0;
}