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

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

程序员文章站 2023-12-30 19:25:04
...

现在来加上色彩

流程:

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

}

效果图:

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

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

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


上一篇:

下一篇: