YUV422图像水平镜像
YUV422简介
YUV细分的话有Y’UV,YUV,YCbCr,YPbPr等类型;本文介绍YUV422图像在做水平镜像时需要注意的问题,数据存储方式为UYVY格式;
YUV422水平镜像注意问题
对于RGB图像水平镜像时,只需要依次将对应位置的RGB值调换即可;但对于YUV422数据格式则需额外注意数据排列问题:
UYVY格式的图像转换成RGB时,一个UYVY组合可以产生2个RGB的图像;如下图所示:
U
Y
1
V
Y
2
UY_{1}VY_{2}
UY1VY2和RGB的转换公式如下:
R
1
=
1.164
∗
(
Y
1
−
16
)
+
1.159
∗
(
V
−
128
)
R_{1} = 1.164*(Y_{1}-16) + 1.159*(V-128)
R1=1.164∗(Y1−16)+1.159∗(V−128);
G
1
=
1.164
∗
(
Y
1
−
16
)
−
0.380
∗
(
U
−
128
)
+
0.813
∗
(
V
−
128
)
G_{1} = 1.164*(Y_{1}-16) - 0.380*(U-128)+ 0.813*(V-128)
G1=1.164∗(Y1−16)−0.380∗(U−128)+0.813∗(V−128);
B
1
=
1.164
∗
(
Y
1
−
16
)
+
2.018
∗
(
U
−
128
)
)
B_{1} = 1.164*(Y_{1}-16) + 2.018*(U-128))
B1=1.164∗(Y1−16)+2.018∗(U−128));
R
2
=
1.164
∗
(
Y
2
−
16
)
+
1.159
∗
(
V
−
128
)
R_{2} = 1.164*(Y_{2}-16) + 1.159*(V-128)
R2=1.164∗(Y2−16)+1.159∗(V−128);
G
2
=
1.164
∗
(
Y
2
−
16
)
−
0.380
∗
(
U
−
128
)
+
0.813
∗
(
V
−
128
)
G_{2} = 1.164*(Y_{2}-16) - 0.380*(U-128)+ 0.813*(V-128)
G2=1.164∗(Y2−16)−0.380∗(U−128)+0.813∗(V−128);
B
2
=
1.164
∗
(
Y
1
−
16
)
+
2.018
∗
(
U
−
128
)
)
B_{2} = 1.164*(Y_{1}-16) + 2.018*(U-128))
B2=1.164∗(Y1−16)+2.018∗(U−128));
由此需注意,在做反转时,需要将Y1和Y2做调换,这样才会在最后显示的RGB图像中完成镜像效果,如下图所示:
代码示意
void flip_img(unsigned char *pIn,int H,int W){
unsigned char *pIn_start=NULL;
unsigned char *pOut_end=NULL;
int j=0,k=0;
for(int i=0;i<H;i++){
pIn_start=pIn+2*i*W;
// pOut_end=pIn+2*i*W+2*W;
pOut_end=pIn+2*i*W;
k=2*W;
j=0;
unsigned char tmp;
for (j=0;j<k;j+=4){
tmp=*(pIn_start+j);
*(pIn_start+j)=*(pIn_start+2*W-4-j);
*(pIn_start+2*W-4-j)=tmp;
tmp=*(pIn_start+j+1);
*(pIn_start+j+1)=*(pIn_start+2*W-1-j);
*(pIn_start+2*W-1-j)=tmp;
tmp=*(pIn_start+j+2);
*(pIn_start+j+2)=*(pIn_start+2*W-2-j);
*(pIn_start+2*W-2-j)=tmp;
tmp=*(pIn_start+j+3);
*(pIn_start+j+3)=*(pIn_start+2*W-3-j);
*(pIn_start+2*W-3-j)=tmp;
k=k-4;
}
}
}
总结
本文主要介绍UYVY图像水平镜像时需要注意的问题。