32位C++改编 风格转移(style)之应用(生成) ---(三)图像加边(扩展)和减边(剪裁)

由于风格转换在图像边缘处效果会差一点,所以先在四周加上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调用两次

该部分结束。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值