matlab中的motion,matlab里面的motion c++实现

该代码段展示了如何在C++中实现Matlab中的运动模糊效果。通过输入角度和距离,计算并创建一个双指针矩阵。代码首先定义了必要的变量,然后计算了像素坐标,接着通过迭代计算每个像素的距离到模糊中心,从而得到模糊效果。最后,代码对结果进行了归一化处理。
摘要由CSDN通过智能技术生成

matlab里面的motion c++实现,返回的是一个双指针矩阵。需要输入角度以及距离;

1.[代码][C/C++]代码

double PI=3.1415926;

int sx, sy;

float *mask=0;

float *mask2=0;

int mask_width;

int mask_height;

float half = (length-1)/2;

float phi =float((fmod(angle+180,180)/180)*PI);

float cosphi = cos(phi);

float sinphi = sin(phi);

int xsign ;

if(cosphi< 0)

{

xsign = -1;

}

else if (angle==90)

xsign = 0;

else

xsign= 1;

int psfwdt = 1;

sx = (int)fabs(half * cosphi +psfwdt*xsign -length*2.2204e-016);

sy = (int)fabs(half * sinphi + psfwdt -length*2.2204e-016);

mask_width = sx;

mask_height = sy;

//cout<

mask =(float*)malloc(sizeof(float)*(sx+1)*(sy+1));

mask2=(float*)malloc(sizeof(float)*(sx*2+1)*(sy*2+1));

float **dist2psf_matrix = (float**)malloc(sizeof(float*)*(sy+1));

float **psf = (float**)malloc(sizeof(float*)*(sy*2+1));

int i = 0,j = 0;

for(i = 0; i< sy*2+1 ;i++)

{

psf[i]=mask2+i*(sx*2+1);

//psf[i]=mask2+(sy*2 - i ) * (sx*2+1);

}

for(i = 0; i< sy+1 ; i++)

{

dist2psf_matrix[i] = mask + i * (sx+1);

//dist2psf_matrix[i] = mask + (sy - i ) * (sx+1);

}

double rad = 0;

int x_position = 0,x_start = 0;

x_start = 0;

for(i = 0; i < sy+1; i ++)

{

x_position = x_start;

for(j = 0; j < sx+1; j++)

{

dist2psf_matrix[i][j] = i * fabs(cosphi)- j * sinphi;

//cout<

rad = sqrt((float)(i * i + j * j));

if(rad >= half && fabs(dist2psf_matrix[i][j]) <= psfwdt)

{

float x2lastpix = half - fabs((x_position +dist2psf_matrix[i][j] * sinphi) / cosphi);

//cout<

dist2psf_matrix[i][j] = sqrt(dist2psf_matrix[i][j] * dist2psf_matrix[i][j] + x2lastpix * x2lastpix);

//cout<

}

//cout<

dist2psf_matrix[i][j] = psfwdt - fabs(dist2psf_matrix[i][j]);

if(dist2psf_matrix[i][j] < 0) dist2psf_matrix[i][j]=0;

x_position ++;

}

}

float sum=0;

for (i=0;i<=2*sy;++i)

{

for (j=0;j<=2*sx;++j)

{

//cout<

psf[i][j]=0;

}

}

for(i =0; i < sy+1; i ++)

{

for(j = 0; j < sx+1; j++)

{

if (i

{psf[i+sy][j]=dist2psf_matrix[i][sx-j];

sum+=dist2psf_matrix[i][sx-j];

//cout<

}

else

psf[i][j]=0;

}

//cout<

}

sum=sum*2-1;

//cout<

for (i=0;i<=sy;++i){

for (j=0;j<=sx;++j)

{

psf[i][2*sx-j]=psf[(2*sy-i)][j];

}

}

if(angle>90)

{

float temp=0;

for (i=0;i<=2*sy;++i)

{

for(j=0;j<=sx;++j)

{

temp=psf[i][j];

psf[i][j]=psf[i][2*sx-j];

psf[i][2*sx-j]=temp;

}

}

}

cout.precision(3);

for(i=0;i

{

for (j=0;j

{

psf[i][j]/=sum;

//cout<

}

//cout<

}

delete[] dist2psf_matrix;

delete[] mask;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值