纯C++超分辨率重建espcn --改编--(三)主函数espcn
程序员文章站
2022-03-09 13:03:31
...
主函数:
void espcn(int up_scale)
{
espcn_x3模型 sr;
// 加载 CNN 模型参数
loadModel(&sr);
int wid=jpg.getwidth();
int hei=jpg.getheight();
cout<<"输入图像宽度:"<<wid<<endl;
cout<<" 高度:"<<hei<<endl;
卷积层 im_b(wid,hei);//即Y通道
im_b.data=new float[wid * hei * sizeof(float)];
卷积层 U(wid,hei),V(wid,hei);
U.data=new float[wid * hei * sizeof(float)];
V.data=new float[wid * hei * sizeof(float)];
//RGB转换为YUV
RGB2YUV(&jpg,&im_b,&U,&V);
//U,V暂时无用,先删除占用内存
delete []U.data; U.data=NULL;
delete []V.data; V.data=NULL;
//总层数
int l=总层数;//
cout<<"共有:"<<l<<"层"<<endl;
//中间过程层数据
卷积层 convfea1(wid,hei,64);
convfea1.data=new float[wid * hei * 64 * sizeof(float)];
卷积层 convfea2(wid,hei,32);
convfea2.data=new float[wid * hei * 32 * sizeof(float)];
卷积层 convfea3(wid,hei,9);
convfea3.data=new float[wid * hei * 9 * sizeof(float)];
// 3倍重建图
卷积层 hR1(wid*3,hei*3);
hR1.data=new float[wid * hei * 9 * sizeof(float)];
float *weight, *bias;
层数据 * 层=sr.所有层;
//循环各层直至结束
for (int i=0;i<l;i++ )//3层
{
cout<<"第 "<<i<<" 层"<<endl;
if (strstr(层->类型, "卷积层"))//返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
{
cout<<"卷积..."<<endl;
//得到权重(也就是卷积核)和偏移
weight=层->权重_数据;
bias=层->偏移_数据;
if (i==0) //第一层
{
//生成出64特征图
vl_nnconv(&im_b,&convfea1,层 ,1,1,2,2,2,2);
vl_tanh(&convfea1);//
//save_卷积层2jpg(&convfea1,"con0");
}
else if(i==1)//第二层
{
//64-> 32
vl_nnconv(&convfea1,&convfea2,层,1,1,1,1,1,1);
vl_tanh(&convfea2);//
//save_卷积层2jpg(&convfea2,"con1");
}
else //第三层
{
//32->9
vl_nnconv(&convfea2,&convfea3,层,1,1,1,1,1,1);
vl_tanh(&convfea3);//
//save_卷积层2jpg(&convfea3,"con2");
}//end
}//end
层++;
}//end
//到这里可以删除
delete []convfea1.data; convfea1.data=NULL;
delete []convfea2.data; convfea2.data=NULL;
//排列 9->1 //convfea3->hR1
像素组合(&convfea3,&hR1);
//save_卷积层2jpg(&hR1,"hr");
//色彩放大(3倍)
ResizeGrayscaleImage(&jpg,3) ;
//卷积层 U(wid,hei),V(wid,hei);
U.height=V.height=hei*3;
U.width =V.width =wid*3;
U.data=new float[wid * hei *9* sizeof(float)];
V.data=new float[wid * hei *9* sizeof(float)];
//RGB转换为YUV
RGB2YUV(&jpg,&U,&V);
//合成色彩重建图
IMAGE im_h(U.width,U.height);
YUV2RGB(&hR1,&U,&V, &im_h);
//保存图像
saveimage(L"espcn 3倍 重建.jpg", &im_h);
//U,V暂时无用,先删除占用内存
delete []U.data; U.data=NULL;
}
运行结果:
原图
espcn 重建3倍
和fscrcnn重建的比较一下:
fscrcnn 3倍 重建
espcn 重建的图好像灰暗了一点,是不是tanh把数据压缩了?
程序下载:
win32位编译的超分辨率 espcn 程序
地址:
https://download.csdn.net/download/juebai123/10652768
结束
上一篇: 平稳退化的应用举例