由于风格转换在图像边缘处效果会差一点,所以先在四周加上10个像数的边,完成后再去掉。
并且,图像在后面有两次缩小2倍的操作,顺便使宽,高成为4的倍数,也到后面还原
伸缩边函数:
//x0, y0 为补齐4的倍数的零头
void 伸缩边(卷积层 & di,int & x0,int & y0,bool 伸缩=true) //扩展到(0,1)间
{
int w边=10;
if(伸缩==true)//加
{
x0=4-(di.width+w边*2) % 4;if(x0==4)x0=0;
y0=4-(di.height+w边*2) % 4;if(y0==4)y0=0;
int w=di.width+w边*2+x0;
int h=di.height+w边*2+y0;
卷积层 t(w,h,di.depth);
t.data=new float[w*h*di.depth];
int wc=di.width;
//复制内容
float *s=di.data;
float *d=t.data;
for(int j=0;j<di.depth;j++)
{
d+=w*w边;//跳过上边
for(int i=0;i<di.height;i++)
{
//复制一行
cblas_scopy(wc,s , 1, d+w边, 1);
//下一行
s+=wc;
d+=w;
}
d+=w*(w边+y0);//跳过下边
}
//删除原来的,设置新的
delete []di.data; di.data=NULL;
di.data=t.data;
di.width=w;di.height=h;
}else //减
{
int w=di.width-w边*2-x0;
int h=di.height-w边*2-y0;
卷积层 t(w,h,di.depth);
t.data=new float[w*h*di.depth];
int wc=di.width;
//复制内容
float *s=di.data;
float *d=t.data;
for(int j=0;j<di.depth;j++)
{
s +=wc*w边;//跳过上边
for(int i=0;i<h;i++)
{
cblas_scopy(w,s+w边 , 1, d, 1);
//下一位置
s+=wc;
d+=w;
}
s +=wc*(w边+y0);//跳过下边
}
//删除原来的,设置新的
delete []di.data; di.data=NULL;
di.data=t.data;
di.width=w;di.height=h;
}
}
在主函数分别能 true false调用两次
该部分结束。