在《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<<"输入图像宽度:"<width<<","<height<<","<depth<width<<","<height<<","<depth<width<<","<height<<","<depth<width<<","<height<<","<depth<width<<","<height<<","<depth<width<<","<<源->height<<","<<源->depth<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格式... "<
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
效果图(还是上图):
这个也可以用彩色的作为输入(相当于换色):
原图
重建图
下载:
给黑白图像自动上色的win程序(2)
可以给黑白图像上彩色的程序(win下),由《siggraph2016_colorization-master》中的 colornet.t7 模型改编而来(修正了前面的一个错误,已经达到和《siggraph2016_colorization-master》中的示例同样效果)
https://download.csdn.net/download/juebai123/11186646