纯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;
}
}
}
效果图:
这是用画图先放大3倍再重建的
还有一个双三次放大问题没解决。先这样吧。
推荐阅读
-
纯C++超分辨率重建VDSR --改编
-
纯C++超分辨率重建LapSRN --改编--(四)偏置乘法
-
纯C++超分辨率重建SRCNN --改编--(五)卷积边界填充
-
纯C++超分辨率重建SRCNN --改编--(六)彩色
-
纯C++超分辨率重建LapSRN --改编--(二)正向卷积vl_nnconv函数
-
纯C++超分辨率重建LapSRN --改编--(一)数据和框架
-
纯C++超分辨率重建LapSRN --改编--(三)转置卷积vl_nnconvt函数
-
纯C++超分辨率重建SRCNN --改编--在Matlab导出卷积核参数(前奏三)
-
纯C++超分辨率重建FSRCNN --改编--(二)核参数修改 和多参激励vl_nnrelu
-
纯C++超分辨率重建espcn --改编--(三)主函数espcn