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

现在来加上色彩

流程:

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倍再重建的

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


猜你喜欢

转载自blog.csdn.net/juebai123/article/details/80583442
今日推荐