纯C++超分辨率重建SRCNN --改编--(六)彩色

匿名 (未验证) 提交于 2019-12-03 00:22:01

现在来加上色彩

流程:

1。RGB转化为YUV

2。拿Y通道去重建

3。重建后转回RGB

RGB转换为YUV:

//RGB转换为YUV void	RGB2YUV(IMAGE * jpg,卷积矩阵 * Y,卷积矩阵 * U,卷积矩阵 * V) { 	int w=Y->width; 	int h=Y->height;  	//对原图像获取指针 	DWORD* M=GetImageBuffer(jpg);  	DWORD t; 	float r,g,b; 	int p;   	//图像转化单色并保存结果 	for (int i = 0; i < h; i++) 	{ 		for (int j = 0; j < w; j++) 		{ 			p=j+i*w; 			t=M[p]; 			r=GetRValue(t); 			g=GetGValue(t); 			b=GetBValue(t);  			//Y = 0.299R + 0.587G + 0.114B 			//U = -0.147R - 0.289G + 0.436B 			//V = 0.615R - 0.515G - 0.100B 			Y->data[p]= (0.299*r + 0.587*g + 0.114*b)/255;//255 			U->data[p] = -0.147*r - 0.289*g + 0.436*b; 			V->data[p] =  0.615*r - 0.515*g - 0.100*b;   		} 	}  }

重建后YUV转回RGB:

//YUV转回RGB void	YUV2RGB(卷积矩阵 * Y,卷积矩阵 * U,卷积矩阵 * V,IMAGE * jpg) { 	int w=Y->width; 	int h=Y->height;  	//分别对原图像获取指针 	DWORD* M=GetImageBuffer(jpg);  	DWORD t; 	float y,u,v,r,g,b,c; 	int p;   	//图像转化单色并保存结果 	for (int i = 0; i < h; i++) 	{ 		for (int j = 0; j < w; j++) 		{  			p=j+i*w; 			y=Y->data[p]*255; 			u=U->data[p]; 			v=V->data[p]; 			if(y<16)y=16;if(y>235)y=235;//取值范围【16,235】  			//R = Y + 1.14V 			//G = Y - 0.39U - 0.58V 			//B = Y + 2.03U 			r=y + 1.14*v; 			if(r>255)r=255;if(r<0)r=0;  			g=y - 0.39*u - 0.58*v; 			if(g>255)g=255;if(g<0)g=0;  			b=y + 2.03*u; 			if(b>255)b=255;if(b<0)b=0;  			c=RGB(r ,g ,b);  			M[p]= c; 		} 	}  }

效果图:


这是用画图先放大3倍再重建的

还有一个双三次放大问题没解决。先这样吧。


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!