在《一篇关于如何用深度学习完成自动上色(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