图像形态S+P变换的OpenCV代码

// _MWT_H_
#pragma once
#include "cv.h"
#include "highgui.h"

using namespace cv;

Mat MWT(Mat img,int nlevs)
{
 int ih = img.rows;
 int iw = img.cols;
 int ih_h = ih/2;
 int iw_h = iw/2;

 img.convertTo(img,CV_64F);

 Mat temp = Mat(img.rows,img.cols,CV_64F,Scalar::all(0));
 for(int n=nlevs;n>0;n--)
 {
  // rows-transformation
  for(int i=0;i<ih;i++)
  {
   for(int j=0;j<iw_h;j++)
   {
    double x11 = img.at<double>(i,2*j);
    double x12 = img.at<double>(i,2*j+1);
    
    double m = (x11+x12)/2;
    double d = x11-x12;
    
    temp.at<double>(i,j) = m;
    temp.at<double>(i,j+iw_h) = d;
   }
  }
  // cols-transformation
  Mat tmp = temp.clone();
  for(int j=0;j<iw;j++)
  {
   for(int i=0;i<ih_h;i++)
   {
    double x11 = tmp.at<double>(2*i,j);
    double x12 = tmp.at<double>(2*i+1,j);
    
    double m = (x11+x12)/2;
    double d = x11-x12;
    
    temp.at<double>(i,j) = m;
    temp.at<double>(i+ih_h,j) = d;
   }
  }
  img = temp.clone();
  iw = iw/2;
  ih = ih/2;
  ih_h = ih_h/2;
  iw_h = iw_h/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--)
 {
  // colums transformation
  for(int j=0;j<iw*2;j++)
  {
   for(int i=0;i<ih;i++)
   {
    double m = img.at<double>(i,j);
    double d = img.at<double>(i+ih,j);

    double  rm = d/2;
    double  rd = -d/2;

       temp.at<double>(2*i,j) = m+rm;
       temp.at<double>(2*i+1,j) = m+rd;
   }
  }
  // rows transformation
  Mat tmp = temp.clone();
  for(int i=0;i<ih*2;i++)
  {
   for(int j=0;j<iw;j++)
   {
    double m = tmp.at<double>(i,j);
    double d = tmp.at<double>(i,j+iw);

    double  rm = d/2;
    double  rd = -d/2;

       temp.at<double>(i,2*j) = m+rm;
       temp.at<double>(i,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 "cv.h"
#include "highgui.h"
#include <iostream>
#include "MWT.h"
#include "IMWT.h"

using namespace cv;
using namespace std;

int main(int argc,char** argv[])
{
 cout<<"Please Input Decomposition level:"<<endl;
 int nlev;
 cin>>nlev;

 Mat img = imread("zoneplate.png",0); 
 namedWindow("lena",1);
 imshow("lena",img);

 Mat imgdec = Mat(img.rows,img.cols,CV_64F,Scalar::all(0));
 imgdec = MWT(img,nlev);

 Mat tmp(imgdec);
 tmp.convertTo(tmp,CV_8U); 
 namedWindow("imgdec",1);
 imshow("imgdec",tmp);

 Mat imgrec = Mat(img.rows,img.cols,CV_8U,Scalar::all(0));
 imgrec = IMWT(imgdec,nlev);

 namedWindow("imgrec",1);
 imshow("imgrec",imgrec);

 waitKey();
 return 0;

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

风的心愿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值