欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

纯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;  
					


	                
}

运行结果:

纯C++超分辨率重建espcn --改编--(三)主函数espcn原图

纯C++超分辨率重建espcn --改编--(三)主函数espcnespcn 重建3倍

和fscrcnn重建的比较一下:

纯C++超分辨率重建espcn --改编--(三)主函数espcnfscrcnn 3倍 重建

espcn 重建的图好像灰暗了一点,是不是tanh把数据压缩了?

程序下载:

win32位编译的超分辨率 espcn 程序

地址:

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

结束

 

相关标签: 超分辨率 espcn