黑白图像自动上色(Colorization)

在《siggraph2016_colorization-master》有两个可以给黑白图片自动上色的模型:colornet.t7 和 colornet_imagenet.t7。

 现来把这个 Torch7 代码翻译成 C++ 代码玩玩。

colornet.t7流程图:

 

 图像中的上半部分就可以完成上色任务了,下半部分是为了加大适用范围加的(大数据训练的分类网络)。

哪个共用权重被我划掉的。

要共哪个?

如果共下面的,估计会影响测试集上色效果,毕竟下面的只是辅助用的,分类网络不能分别图像,只能指出图像中有什么东西。

如果共上面的,下面的网络相当于已经作费。

说了一些费话,开始吧。

先定义数据池:

struct PsColor模型
{
	//解码器部分 着色
	层数据 * conv_d1;//512->256
	层数据 * conv_d2;//256->128
	层数据 * conv_d3;//128->64
	层数据 * conv_d4;//64->64
	层数据 * conv_d5;//64->32
	层数据 * conv_d6;//32->2
	
	//编码器部分	

	//中级特征
	层数据 * conv_e7;//512->512
	层数据 * conv_e8;//512->256
	//低级特征
	层数据 * conv_e1;//1->64
	层数据 * conv_e2;//64->128
	层数据 * conv_e3;//128->128
	层数据 * conv_e4;//128->256
	层数据 * conv_e5;//256->256
	层数据 * conv_e6;//256->512

	//分类器部分	
	
	//低级特征
	层数据 * conv_f1;//1->64
	层数据 * conv_f2;//64->128
	层数据 * conv_f3;//128->128
	层数据 * conv_f4;//128->256
	层数据 * conv_f5;//256->256
	层数据 * conv_f6;//256->512

	//全局特征
	层数据 * conv_f7;//512->512
	层数据 * conv_f8;//512->512
	层数据 * conv_f9;//512->512
	层数据 * conv_f10;//512->512

	//全连接
	层数据 * fc1;//512->512
	层数据 * fc2;//512->512
	层数据 * fc3;//512->512
	
	
	//构造函数
	PsColor模型();

};

主函数流程:

   输入图像 rgb(3通道黑白图)->y
1。加边(8的倍数)
2。分类部分
3。编码部分
4。融合
5。着色(解码)部分 生成Lab中的ab
   去边(回到原图大小)
6。y,y,y->L(ab)
7。L+ab= Lab
8。Lab->rgb->YUV
9。替换y,并->rgb
   保存彩色图

主函数:

void PsColor(char * savefilename,PsColor模型 & sr)
{

	//	1。加边(8的倍数)
	//  2。分类部分
	//  3。编码部分
	//  4。融合
	//  5。着色(解码)部分 生成Lab中的ab
	//     去边(回到原图大小)
	//  6。y,y,y->L(ab)
	//  7。L+ab= Lab
	//  8。Lab->rgb->YUV
	//  9。替换Y,并->rgb

	int wid=bmp.width;
	int hei=bmp.height;
	int wh=wid * hei;

		cout<<"输入图像宽度:"<<wid<<endl;
		cout<<"        高度:"<<hei<<endl;
//
	卷积层 Y(wid,hei);//亮度
	Y.data=new float[wid * hei ]; 

	bmp2YUV(&Y);



	卷积层 si(wid,hei);//亮度
	si.data=new float[wid * hei ]; 

	卷积层复制(&Y,&si);

	卷积层加以(si,-0.445f);

	//	1。加边(8的倍数)

	//伸缩零头:使宽,高保证为8的倍数而设,即 宽(高)除8的余数 + x0(y0) = 8
	int x0=0, y0=0;
	伸缩边(si, x0, y0);

	卷积层 si备份(si.width,si.height);//亮度
	si备份.data=new float[si.width * si.height ]; 

	卷积层复制(&si,&si备份);
	
	//  2。分类部分

		cout<<"分类部分..."<<endl;
	//缩放到 224x224
	卷积层 di(224,224);
	di.data=new float[224*224];


	卷积层双三次插值(si,di);

	卷积层* low = 低级特征前传f(di,sr);
	cout<<low->width<<","<<low->height<<","<<low->depth<<endl;

	卷积层* glo = 全局特征前传(*low,sr);
	cout<<glo->width<<","<<glo->height<<","<<glo->depth<<endl;

	del卷积层(*low);


	//  3。编码部分

		cout<<"编码部分..."<<endl;
	low = 低级特征前传e(si备份,sr);
	cout<<low->width<<","<<low->height<<","<<low->depth<<endl;

	卷积层 *mid = 中级特征前传(*low,sr);
	cout<<mid->width<<","<<mid->height<<","<<mid->depth<<endl;

		del卷积层(*low);

	//  4。融合

		cout<<"融合..."<<endl;
	卷积层 * fusion =  融合(*glo,*mid);
	cout<<fusion->width<<","<<fusion->height<<","<<fusion->depth<<endl;


		del卷积层(*glo);
		del卷积层(*mid);

	//  5。着色(解码)部分

		cout<<"解码-生成彩色..."<<endl;
	卷积层 * 源 = 着色前传(*fusion,sr);
	cout<<源->width<<","<<源->height<<","<<源->depth<<endl;
	伸缩边(*源, x0, y0,false);

		del卷积层(*fusion);


	//  6。y,y,y->L(ab), L+ab= Lab
	卷积层 rgb(wid,hei,3);
	rgb.data=new float[wid*hei*3];

	float *lab=new float[wid*hei*3];

	RGB2Lab(bmp,lab);//rgb-->lab


	//  7。L+ab= Lab

	lab2卷积层(lab,rgb);//lab-->卷积层



	卷积层乘以(*源,1.2f);//加大颜色------自加

	卷积层 ab1(wid,hei,1);
	卷积层 ab2(wid,hei,1);

	ab1.data=rgb.data+wh;
	ab2.data=源->data;
	卷积层复制(&ab2,&ab1);

	ab1.data=rgb.data+wh*2;
	ab2.data=源->data+wh;
	卷积层复制(&ab2,&ab1);
	卷积层加以(ab1,10.f);//蓝->黄--------自加
		
	//卷积层 ab(wid,hei,2);
	//ab.data=rgb.data+wh;
	//卷积层复制(源,&ab);

	卷积层2lab(rgb,lab);//卷积层-->lab

	//  8。Lab->rgb->YUV

	Lab2RGB(bmp,lab);//lab-->rgb


	卷积层 U(wid,hei);
	U.data=源->data; 
	卷积层 V(wid,hei);
	V.data=源->data+wid * hei ; 
	bmp2YUV(&U,&V);

	//  9。替换Y,并->rgb

	YUV2bmp(&Y,&U,&V);
	
	del卷积层(*源);
	


	cout<<"图像转换成jpg格式... "<<endl;


	savejpg(savefilename);//保存bmp中的数据

	cout<<"转换文件已经保存为:    "<<savefilename<<endl;

}

RGB 和 Lab 互换来自《RGB与Lab颜色空间互相转换》一文,也不知道是该代码中的原因还是别的,重建的彩色偏蓝,我稍稍蓝->黄方向调了一点(在b通道+10),并且 ab 整体彩色加强了一点(x1.2),其它和 Torch7 应该相差不大了(我的理解),我也没有安装它,也不知道原代码运行效果。

效果图:

输入图

重建图

再来一张:

输入

重建

如果没有分类器也是可以出彩色的:

效果图(还是上面的图):

无分类重建

结束。

下载:

给黑白图像自动上色的win程序

可以给黑白图像上彩色的程序(win下),由《siggraph2016_colorization-master》中的 colornet.t7 模型改编而来

https://download.csdn.net/download/juebai123/11183384

---------------------------------------分隔线-----------------------------------------------------------

由于上面没有达到《siggraph2016_colorization-master》中的示例图片的效果,我把ab导出程序中准备在其它地方去调试时发现只有a通道有数据。原来以前用的放大y通道函数只放大一个通道!!

所以 ab 和 L 合成部分为:

	//  7。L+ab= Lab

	lab2卷积层(lab,rgb);//lab-->卷积层



	//卷积层乘以(*源,1.2f);//加大颜色------自加

	//卷积层 ab1(wid,hei,1);
	//卷积层 ab2(wid,hei,1);

	//ab1.data=rgb.data+wh;
	//ab2.data=源->data;
	//卷积层复制(&ab2,&ab1);
	//卷积层加以(ab1,-2.f);//蓝->黄--------自加

	//ab1.data=rgb.data+wh*2;
	//ab2.data=源->data+wh;
	//卷积层复制(&ab2,&ab1);
			
	卷积层 ab(wid,hei,2);
	ab.data=rgb.data+wh;
	卷积层复制(源,&ab);

	卷积层2lab(rgb,lab);//卷积层-->lab

	//  8。Lab->rgb->YUV

效果图(还是上图):

1图

第2图

这个也可以用彩色的作为输入(相当于换色):

原图

重建图

下载:

 给黑白图像自动上色的win程序(2)

可以给黑白图像上彩色的程序(win下),由《siggraph2016_colorization-master》中的 colornet.t7 模型改编而来(修正了前面的一个错误,已经达到和《siggraph2016_colorization-master》中的示例同样效果)

https://download.csdn.net/download/juebai123/11186646

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值