📄 operations.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 + -