⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 operations.cpp

📁 A paper that I presented on Supervisory Control and Data Acquisition (SCADA) won the second prize at
💻 CPP
字号:
/*!
*  
*
* sharat@mit.edu
*/
#include "image.h"
#include "filter.h"
#include "operations.h"
#include<functional>

using namespace std;

image conv2d::operator()(const image& img,const filter& filt) 
{
  CvSize   szimg = img.dim();
  CvSize   szfilt= filt.dim();
  image    result(szimg.height,szimg.width);
  image    pd_img(szimg.height+szfilt.height-1,szimg.width+szfilt.width-1);
  /*pad the image*/
  cvCopyMakeBorder(img,pd_img,cvPoint(szfilt.width/2,szfilt.height/2),IPL_BORDER_CONSTANT);
  cvMatchTemplate(pd_img,filt,result,CV_TM_CCORR);
  return abs(result);
} 

image xcorr2d::operator()(const image& img,const filter& filt) 
{

  CvSize szimg = img.dim();
  CvSize szfilt= filt.dim();
#if 0
   image  result(szimg.height,szimg.width);
   for(int i=0;i<szimg.height;i++)
    for(int j=0;j<szimg.width;j++)
      {
	float val = 0;
	float sum = 0;
	for(int k=-szfilt.height/2,y=0;k<=szfilt.height/2;k++,y++)
	  {
	    int u  = (i+k);
	    if(u < 0 || u>=szimg.height) continue;
	    for(int l=-szfilt.width/2,x=0;l<=szfilt.width/2;l++,x++)
	    {
	      int v = (l+j);
	      if(v<0 || v>=szimg.width) continue;
	        val += img[u][v]*filt[y][x];
	        sum += img[u][v]*img[u][v];
	    }//end l
	  }//end k
	result[i][j] = fabs(val)/sqrt(sum+1e-16);
      }
#else
  image  result(szimg.height,szimg.width);
  image  pd_img(szimg.height+szfilt.height-1,szimg.width+szfilt.width-1);
  /*pad the image*/
  cvCopyMakeBorder(img,pd_img,cvPoint(szfilt.width/2,szfilt.height/2),IPL_BORDER_CONSTANT);
  cvMatchTemplate(pd_img,filt,result,CV_TM_CCORR_NORMED);
  //cvMatchTemplate(pd_img,filt,result,CV_TM_CCOEFF_NORMED);
#endif
  return abs(result);
}

image dist2d::operator()(const image& img,const filter& filt)
{
  CvSize szimg = img.dim();
  CvSize szfilt= filt.dim();
  image  pd_img(szimg.height+szfilt.height-1,szimg.width+szfilt.width-1);
  image  result(szimg.height,szimg.width);
  /*pad the image*/
  cvCopyMakeBorder(img,pd_img,cvPoint(szfilt.width/2,szfilt.height/2),IPL_BORDER_CONSTANT);
  cvMatchTemplate(pd_img,filt,result,CV_TM_SQDIFF);
  return result;
}

image hmax::operator()(const image& img,int pool,int shift)
{
  int i,j,k,l,u,v,x,y;
  double max_val,px_val;

  CvSize sz   = img.dim();
  image result((int)ceil((double)sz.height/shift),(int)ceil((double)sz.width/shift));
  for(i=0,y=0;i<sz.height;i+=shift,y++)
    {
      for(j=0,x=0;j<sz.width;j+=shift,x++)
	{
	  max_val = -1e6;
	  for(k=-pool/2;k<pool/2;k++)
	    {
	      u = (i+k);
	      if(u <0 || u >=sz.height) continue;
	    for(l=-pool/2;l<pool/2;l++)
	      {
		v = (l+j);
		if( v <0 || v >=sz.width) continue;
		px_val = img[u][v];
		if(px_val > max_val) 
		  max_val = px_val;
	      } /*end l*/
	    }/*end k*/
	  result[y][x]= max_val;  
	}/*end j*/
    }/*end i*/
  return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -