请高高手指点(关于图象处理)

boyzhxj 2001-12-07 08:34:11
求两个二维矩阵的卷积,用傅立叶变换转到频域计算,然后用傅立叶逆变换回到时域,哪位大侠知道算法(请详细一点),有源程序更好!
...全文
60 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
boyzhxj 2001-12-07
  • 打赏
  • 举报
回复
谢谢楼上的
但如果我的两个矩阵都很大,想用傅立叶变换,该怎么做?我没有这方面的算法,是不是卷积核
要补零,还是怎样?
anywn_cwh 2001-12-07
  • 打赏
  • 举报
回复
毕设时的一个函数,再讨论
anywncwh@163.net
/*****************************************
卷积核心算法
*****************************************/
UINT CDib::interPolate(UINT *Src,int x,int y, float u,float v, int scanw, int scanh)
{
UINT red[4][4];
UINT green[4][4];
UINT blue[4][4];
UINT r,g,b;
r=g=b=0;

if(1)
{
int xx[4];
int yy[4];

xx[0]=x-1;
xx[1]=x;
xx[2]=x+1;
xx[3]=x+2;

yy[0]=y-1;
yy[1]=y;
yy[2]=y+1;
yy[3]=y+2;

if(xx[0]<0)
xx[0]=0;
if(yy[0]<0)
yy[0]=0;

if(xx[2]>scanw-1)
xx[2]=scanw-1;
if(yy[2]>scanh-1)
yy[2]=scanh-1;
if(xx[3]>scanw-1)
xx[3]=scanw-1;
if(yy[3]>scanh-1)
yy[3]=scanh-1;

int i=0;
int j=0;

for(i=0;i<4;i++)
{
int indexBase = yy[i]*scanw;
for(j=0;j<4;j++)
{
int index = indexBase + xx[j];
red[i][j] = 0x000000ff&(Src[index]);
green[i][j] = 0x000000ff&(Src[index]>>8);
blue[i][j] = 0x000000ff&(Src[index]>>16);
}
}

float su[4];
float sv[4];
su[0] = sinx_x(1.0f+u);
su[1] = sinx_x(u);
su[2] = sinx_x(1.0f-u);
su[3] = sinx_x(2.0f-u);

sv[0] = sinx_x(1.0f+v);
sv[1] = sinx_x(v);
sv[2] = sinx_x(1.0f-v);
sv[3] = sinx_x(2.0f-v);

float sv_r[4];
float sv_g[4];
float sv_b[4];

for(i=0;i<4;i++)
{
sv_r[i]=sv_g[i]=sv_b[i]=0.0;
for(j=0;j<4;j++)
{
sv_r[i]+=(sv[j]*red[j][i]);
sv_g[i]+=(sv[j]*green[j][i]);
sv_b[i]+=(sv[j]*blue[j][i]);
}
}
float r1 = (su[0]*sv_r[0]+su[1]*sv_r[1]+su[2]*sv_r[2]+su[3]*sv_r[3]);
float r2 = (su[0]*sv_g[0]+su[1]*sv_g[1]+su[2]*sv_g[2]+su[3]*sv_g[3]);
float r3 = (su[0]*sv_b[0]+su[1]*sv_b[1]+su[2]*sv_b[2]+su[3]*sv_b[3]);

if((r1-(UINT)r1)>0.5f)
r=(UINT)r1+1;
else
r=(UINT)r1;
if((r2-(UINT)r2)>0.5f)
g=(UINT)r2+1;
else
g=(UINT)r2;
if((r3-(UINT)r3)>0.5f)
b=(UINT)r3+1;
else
b=(UINT)r3;


r = (r<0)?0:((r>255)?255:r);
g = (g<0)?0:((g>255)?255:g);
b = (b<0)?0:((b>255)?255:b);

}
else if(1==0)
{
int red[2][2];
int green[2][2];
int blue[2][2];
int xx[2];
int yy[2];
xx[0]=x;xx[1]=x+1;
yy[0]=y;yy[1]=y+1;
if(xx[1]>scanw-1)
xx[1] = scanw-1;
if(yy[1]>scanh-1)
yy[1] = scanh-1;

for(int i=0;i<2;i++)
{
int indexBase = yy[i]*scanw;
for(int j=0;j<2;j++)
{
int index = indexBase + xx[j];
red[j][i] = 0x000000ff&(Src[index]);
green[j][i] = 0x000000ff&(Src[index]>>8);
blue[j][i] = 0x000000ff&(Src[index]>>16);

}
}

r = (UINT)((1-u)*(1-v)*red[0][0]+(1-u)*v*red[0][1]+u*(1-v)*red[1][0]+u*v*red[1][1]);
g = (UINT)((1-u)*(1-v)*green[0][0]+(1-u)*v*green[0][1]+u*(1-v)*green[1][0]+u*v*green[1][1]);
b = (UINT)((1-u)*(1-v)*blue[0][0]+(1-u)*v*blue[0][1]+u*(1-v)*blue[1][0]+u*v*blue[1][1]);
}
else
{

int index = y*scanw+x;
r = 0x000000ff&(Src[index]);
g = 0x000000ff&(Src[index]>>8);
b = 0x000000ff&(Src[index]>>16);

}

return (0x00ffffff&((b<<16)|(g<<8)|r));
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧