现在来加上色彩
流程:
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倍再重建的
还有一个双三次放大问题没解决。先这样吧。