中值形态小波变换的OpenCV代码

///

//-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;

}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风的心愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值