黑白图像自动上色(颜色迁移版)

在《一篇关于如何用深度学习完成自动上色(Automatic Image Colorization)的论文浅析》看到这个模型也可以作颜色风格迁移,这里也来试试,先换另一个模型:colornet_imagenet.t7。

看图:

 这个模型和前面的哪个除了训练集不同外,着色输入层核大小已经换成了1x1了,总体来说基本相同。

RGB 和 Lab 互换 按《opencv2,RGB转Lab色彩空间》一文操作

主函数:

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。分类部分

	if (读取风格名(Style_Name)==false)
		return;
		//载入风格图
	if (Resizeloadjpg(Style_Name)==false)
	{
				
		cout<<"可能需要在'风格图路径和名称.txt'文件中写上一个正确的文件名!!!"<<endl;

		return;
	}
		int swid=bmp.width;
		int shei=bmp.height;
		int swh=wid * hei;

	//
		卷积层 sY(swid,shei);//亮度
		sY.data=new float[swid * shei ]; 

		bmp2YUV(&sY);
		
		卷积层加以(sY,-0.445f);

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


	卷积层双三次插值(sY,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);

		//save_卷积层2txt(源,"ab.txt");

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

	Resizeloadjpg(jpgname);//重新载入

	bmp2RGB(rgb);//rgb
	rgb2lab(rgb);//lab


	//  7。L+ab= Lab


	卷积层 ab(wid,hei,2);
	ab.data=rgb.data+wh;
	卷积层复制(源,&ab);

	lab2rgb(rgb);//rgb

	//  8。Lab->rgb->YUV

	RGB2bmp(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;

}

两个灰度图:

分别上色:

互为风格图:

可以看出有对方的颜色了(前提是类型相似)。

再来看一个例子

两个灰度图:

分别上色:

互为风格图:

 

下载:

给黑白图像自动上色并可以作颜色迁移的win程序

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

https://download.youkuaiyun.com/download/juebai123/11194075

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值