基于YUV的色相调节(一)

文章目录

  • YUV公式
    • 转换系数
    • 转换系数怎么得来?
    • YUV公式的一些性质
    • YUV域调节色相的原理(三个矩阵的乘)
  • 预备工作:逆矩阵(YUV->RGB)的系数
    • 3x3矩阵求逆公式
    • 第一列的系数
    • 其他系数
  • 求解三个矩阵的乘

提到调节图片色相,通俗的做法是将图片转为用HSL或者HSV之类的颜色模型表达,调节H之后再转回去。这是一个可行的方案,但性能差一些,很多专业的编辑工具中不是这么做的,它们通过一个3x3的矩阵直接进行色相转换,那么问题来了,这个3x3的矩阵是怎么来的?本文主要讨论这个问题。

PS:图片的原始色彩模型为RGB。

一些基础知识:

  • RGB有它自己的优势,比如符合人的生物视觉系统,各通道具有相同的量纲,易于硬件实现和软件处理。但是,RGB对色彩的表达“不直观”。
  • 颜色的直观表达为“颜色是什么,浓淡、亮暗”等属性,HSV和HSL就是这么一种色彩模型。H(Hue)色相,描述颜色是什么;S(Saturation)饱和度,描述颜色的浓淡;V或L(Luminance)亮度,描述颜色的亮暗。
  • 还有一些颜色模型,它们通常把颜色分为“亮度、色度”两个维度进行描述,其中亮度通常占一个通道,色度占两个通道。如YUV,Y是亮度,UV是色度;Lab,L是亮度,ab是色度。
  • 在上述提到的所有颜色模型中,RGB与HSV,HSL,Lab等之类的转换是非线性的,计算相对复杂一些;RGB与YUV之间的转换是线性的,计算量小,效率高。什么是线性转换?通俗理解就是使用一个3x3矩阵就可以完成转换的就叫线性。

YUV公式

以Rec.709为例。
网上搜一下容易知道RGB与YUV之间的转换如下(Wikipedia):

转换系数

[ Y U V ] = [ 0.2126 0.7152 0.0722 − 0.09991 − 0.33609 0.436 0.615 − 0.55861 − 0.05639 ] [ R G B ] (1) \begin{bmatrix} Y \\ U \\ V \end{bmatrix}= \begin{bmatrix} 0.2126 & 0.7152 & 0.0722 \\ -0.09991 & -0.33609 & 0.436 \\ 0.615 & -0.55861 & -0.05639 \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} \tag{1} YUV = 0.21260.099910.6150.71520.336090.558610.07220.4360.05639 RGB (1)

[ R G B ] = [ 1 0 1.28033 1 − 0.21482 − 0.38059 1 2.12798 0 ] ⋅ [ Y U V ] (2) \begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1 & 0 & 1.28033 \\ 1 & -0.21482 & -0.38059 \\ 1 & 2.12798 & 0 \end{bmatrix} \cdot \begin{bmatrix} Y \\ U \\ V \end{bmatrix} \tag{2} RGB = 11100.214822.127981.280330.380590 YUV (2)

仅知道这两个转换矩阵的话不太足够,为了更深入的推到色相转换的公式,需要深入分析一下RGB与YUV之间的转换。

转换系数怎么得来?

Rec.709标准的一些参数规定如下:

W R = 0.2126 , W G = 1 − W R − W B = 0.7152 , W B = 0.0722 , U max = 0.436 , V max = 0.615. (3) \begin{aligned} W_R &= 0.2126, \\ W_G &= 1 - W_R - W_B = 0.7152, \\ W_B &= 0.0722, \\ U_{\text{max}} &= 0.436, \\ V_{\text{max}} &= 0.615. \end{aligned} \tag{3} WRWGWBUmaxVmax=0.2126,=1WRWB=0.7152,=0.0722,=0.436,=0.615.(3)

  • WR,WG,WB分别是红、绿、蓝三个通道对亮度分量 Y 的贡献权重。这些权重基于人眼对不同波长光的敏感度。
  • Umax,Vmax分别是色度分量 U、V 的最大范围,用于计算色度系数。

Y通过计算WR,WG,WB对RGB三个通道的加权和得到,而U 和 V 是基于颜色通道偏离亮度 Y 的差值并经过缩放得到的,即:
Y = W R ⋅ R + W G ⋅ G + W B ⋅ B , U = U max ⋅ B − Y 1 − W B = U max 1 − W B ( − W R ⋅ R − W G ⋅ G + ( 1 − W B ) ⋅ B ) , V = V max ⋅ R − Y 1 − W R = V max 1 − W R ( ( 1 − W R ) ⋅ R − W G ⋅ G − W B ⋅ B ) (4) \begin{aligned} Y &= W_{R}\cdot R + W_{G}\cdot G + W_{B}\cdot B, \\ U &= U_{\text{max}} \cdot \frac{B - Y}{1 - W_{B}} = \frac {U_{\text{max}}}{1 - W_{B}}(-W_R\cdot R - W_{G}\cdot G + (1-W_B)\cdot B), \\ V &= V_{\text{max}} \cdot \frac{R - Y}{1 - W_{R}}= \frac {V_{\text{max}}}{1 - W_{R}}((1-W_R)\cdot R - W_{G}\cdot G -W_B\cdot B) \end{aligned} \tag{4} YUV=WRR+WGG+WBB,=Umax1WBBY=1WBUmax(WRRWGG+(1WB)B),=Vmax1WRRY=1WRVmax((1WR)RWGGWBB)(4)

将WR,WG,WB,Umax,Vmax的数值带入到公式(4),就可以计算出公式(1)(2)的3x3系数矩阵。

YUV公式的一些性质

下面我们要用不同的方式来记录RGB->YUV的系数矩阵,首先是通式:

[ Y U V ] = [ a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ] [ R G B ] (5) \begin{bmatrix} Y \\ U \\ V \end{bmatrix}= \begin{bmatrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} \tag{5} YUV = a00a10a20a01a11a21a02a12a22 RGB (5)

然后是使用WR,WG,WB,Umax,Vmax的表达:

U m = U max 1 − W B V m = V max 1 − W R \begin{aligned} U_m &= \frac {U_{\text{max}}}{1 - W_{B}} \\ V_m &= \frac {V_{\text{max}}}{1 - W_{R}} \end{aligned} UmVm=1WBUmax=1WRVmax
那么:
[ Y U V ] = [ W R W G W B − U m W R − U m W G U m ( 1 − W B ) V m ( 1 − W R ) − V m W G − V m W B ] [ R G B ] (6) \begin{bmatrix} Y \\ U \\ V \end{bmatrix}= \begin{bmatrix} W_R & W_G & W_B \\ -U_mW_R & -U_mW_G & U_m(1-W_B) \\ V_m(1-W_R) & -V_mW_G & -V_mW_B \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} \tag{6} YUV = WRUmWRVm(1WR)WGUmWGVmWGWBUm(1WB)VmWB RGB (6)

需主意以下性质:

  • W R + W G + W B = 1 W_R + W_G + W_B = 1 WR+WG+WB=1,即 a 00 + a 01 + a 02 = 1 a_{00} + a_{01} + a_{02}=1 a00+a01+a02=1,其含义是亮度信息经转换之后不发生变化。
  • a 10 + a 11 + a 12 = 0 a_{10} + a_{11} + a_{12} = 0 a10+a11+a12=0 a 20 + a 21 + a 22 = 0 a_{20} + a_{21} + a_{22} = 0 a20+a21+a22=0,即矩阵的第二行系数之和与第三行系数之和分别都是0,其含义是色度不包含亮度信息。

给这些条件重新罗列一下,记个公式编号,方便后续引用:
a 00 + a 01 + a 02 = 1 a 10 + a 11 + a 12 = 0 a 20 + a 21 + a 22 = 0 (7) \begin{aligned} a_{00} + a_{01} + a_{02} &=1 \\ a_{10} + a_{11} + a_{12} &= 0 \\ a_{20} + a_{21} + a_{22} &= 0 \end{aligned} \tag{7} a00+a01+a02a10+a11+a12a20+a21+a22=1=0=0(7)

YUV域调节色相的原理(三个矩阵的乘)

首先将RGB转为YUV,由于色相属于色度信息,所以就对UV进行一些调节操作,色相调节主要是针对UV进行坐标旋转,完事后然后再转回RGB。

记:

  • RGB->YUV的转换矩阵为 M R G B 2 Y U V M_{RGB2YUV} MRGB2YUV
  • YUV->RGB的转换矩阵为 M Y U V 2 R G B M_{YUV2RGB} MYUV2RGB,它与上面互逆。
  • 对UV进行旋转的矩阵为 R U V R_{UV} RUV

R U V R_{UV} RUV可以表达如下:

[ Y ′ U ′ V ′ ] = [ 1 0 0 0 c o s θ − s i n θ 0 s i n θ c o s θ ] [ Y U V ] (8) \begin{bmatrix} Y' \\ U' \\ V' \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0\\ 0 & cos{\theta} & -sin{\theta} \\ 0 & sin{\theta} & cos{\theta} \end{bmatrix} \begin{bmatrix} Y \\ U \\ V \end{bmatrix} \tag{8} YUV = 1000cosθsinθ0sinθcosθ YUV (8)

调节原理可以表示如下:
[ R ′ , G ′ , B ′ ] T = M Y U V 2 R G B R U V M R G B 2 Y U V [ R , G , B ] T (9) [R', G', B']^T = M_{YUV2RGB} R_{UV} M_{RGB2YUV} [R, G, B]^T \tag{9} [R,G,B]T=MYUV2RGBRUVMRGB2YUV[R,G,B]T(9)

实际计算中,可以预先先计算上面的三个转换矩阵,合为一个:
M = M Y U V 2 R G B R U V M R G B 2 Y U V (10) M=M_{YUV2RGB} R_{UV} M_{RGB2YUV} \tag{10} M=MYUV2RGBRUVMRGB2YUV(10)

好了,讲道理到了这里已经把所有的理论都摆清楚了,但是按照这种方式调节出来的结果与一些专业转件的结果不完全一样,而这些专业软件都比较成熟了,应该有一定的道理,所以下面深入分析一下,看看可能得差异在哪里。重点分析转换矩阵

预备工作:逆矩阵(YUV->RGB)的系数

3x3矩阵求逆公式

因为 M R G B 2 Y U V M_{RGB2YUV} MRGB2YUV M Y U V 2 R G B M_{YUV2RGB} MYUV2RGB互逆,所以分析过程中势必要涉及到3x3矩阵的求逆,这里把相关公式罗列一下:

针对矩阵:
A = [ a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ] (11) A= \begin{bmatrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \end{bmatrix} \tag{11} A= a00a10a20a01a11a21a02a12a22 (11)

其行列式的值:
det ⁡ ( A ) = ∣ a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 ∣ = a 00 ( a 11 a 22 − a 12 a 21 ) − a 01 ( a 10 a 22 − a 12 a 20 ) + a 02 ( a 10 a 21 − a 11 a 20 ) (12) \det(A) = \begin{vmatrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \end{vmatrix}= a_{00}(a_{11}a_{22} - a_{12}a_{21}) - a_{01}(a_{10}a_{22} - a_{12}a_{20}) + a_{02}(a_{10}a_{21} - a_{11}a_{20}) \tag{12} det(A)= a00a10a20a01a11a21a02a12a22 =a00(a11a22a12a21)a01(a10a22a12a20)+a02(a10a21a11a20)(12)

逆矩阵为:
A − 1 = 1 det ⁡ ( A ) [ a 11 a 22 − a 12 a 21 a 02 a 21 − a 01 a 22 a 01 a 12 − a 02 a 11 a 12 a 20 − a 10 a 22 a 00 a 22 − a 02 a 20 a 02 a 10 − a 00 a 12 a 10 a 21 − a 11 a 20 a 01 a 20 − a 00 a 21 a 00 a 11 − a 01 a 10 ] (13) A^{-1} = \frac{1}{\det(A)} \begin{bmatrix} a_{11}a_{22} - a_{12}a_{21} & a_{02}a_{21} - a_{01}a_{22} & a_{01}a_{12} - a_{02}a_{11} \\ a_{12}a_{20} - a_{10}a_{22} & a_{00}a_{22} - a_{02}a_{20} & a_{02}a_{10} - a_{00}a_{12} \\ a_{10}a_{21} - a_{11}a_{20} & a_{01}a_{20} - a_{00}a_{21} & a_{00}a_{11} - a_{01}a_{10} \end{bmatrix} \tag{13} A1=det(A)1 a11a22a12a21a12a20a10a22a10a21a11a20a02a21a01a22a00a22a02a20a01a20a00a21a01a12a02a11a02a10a00a12a00a11a01a10 (13)

将上式矩阵中的部分,也就是代数余子式,记为:
C = [ c 00 c 01 c 02 c 10 c 11 c 12 c 20 c 21 c 22 ] C= \begin{bmatrix} c_{00} & c_{01} & c_{02} \\ c_{10} & c_{11} & c_{12} \\ c_{20} & c_{21} & c_{22} \end{bmatrix} C= c00c10c20c01c11c21c02c12c22

那么就有
c 00 = a 11 a 22 − a 12 a 21 c 01 = a 02 a 21 − a 01 a 22 c 02 = a 01 a 12 − a 02 a 11 . . . \begin{aligned} c_{00} &= a_{11}a_{22} - a_{12}a_{21} \\ c_{01} &= a_{02}a_{21} - a_{01}a_{22} \\ c_{02} &= a_{01}a_{12} - a_{02}a_{11} \\ ... \end{aligned} c00c01c02...=a11a22a12a21=a02a21a01a22=a01a12a02a11

第一列的系数

结合条件(7)对行列式公式(12)做一些化简,如消掉公式(12)中的 a 10 , a 20 a_{10}, a_{20} a10,a20

根据条件(7)有:
a 10 = − ( a 11 + a 12 ) a 20 = − ( a 21 + a 22 ) \begin{aligned} a_{10} &= -(a_{11} + a_{12})\\ a_{20} &= -(a_{21} + a_{22}) \end{aligned} a10a20=(a11+a12)=(a21+a22)
将其带入公式(12)得:

第一项不动,罗列下来:
a 00 ⋅ ( a 11 a 22 − a 12 a 21 ) a_{00} \cdot (a_{11}a_{22} - a_{12}a_{21}) a00(a11a22a12a21)

第二项:
− a 01 ⋅ ( − ( a 11 + a 12 ) a 22 + ( a 21 + a 22 ) a 12 ) = − a 01 ⋅ ( − a 11 a 22 − a 12 a 22 + a 21 a 12 + a 22 a 12 ) = − a 01 ⋅ ( − a 11 a 22 + a 12 a 21 ) = a 01 ⋅ ( a 11 a 22 − a 12 a 21 ) \begin{aligned} & -a_{01} \cdot ( -(a_{11} + a_{12}) a_{22} + (a_{21} + a_{22}) a_{12}) \\ &=-a_{01} \cdot ( -a_{11}a_{22} - a_{12}a_{22} + a_{21}a_{12} + a_{22}a_{12}) \\ & =-a_{01} \cdot ( -a_{11}a_{22} + a_{12}a_{21}) \\ & =a_{01} \cdot ( a_{11}a_{22} - a_{12}a_{21}) \end{aligned} a01((a11+a12)a22+(a21+a22)a12)=a01(a11a22a12a22+a21a12+a22a12)=a01(a11a22+a12a21)=a01(a11a22a12a21)

第三项:
a 02 ⋅ ( − ( a 11 + a 12 ) a 21 + ( a 21 + a 22 ) a 11 ) = a 02 ⋅ ( − a 11 a 21 − a 12 a 21 + a 21 a 11 + a 22 a 11 ) = a 02 ⋅ ( a 11 a 22 − a 12 a 21 ) \begin{aligned} & a_{02} \cdot ( -(a_{11} + a_{12}) a_{21} + (a_{21} + a_{22}) a_{11}) \\ &=a_{02} \cdot ( -a_{11}a_{21} - a_{12}a_{21} + a_{21}a_{11} + a_{22}a_{11}) \\ & = a_{02} \cdot ( a_{11}a_{22} - a_{12}a_{21}) \end{aligned} a02((a11+a12)a21+(a21+a22)a11)=a02(a11a21a12a21+a21a11+a22a11)=a02(a11a22a12a21)

三项之和:
d e t ( A ) = a 00 ⋅ ( a 11 a 22 − a 12 a 21 ) + a 01 ⋅ ( a 11 a 22 − a 12 a 21 ) + a 02 ⋅ ( a 11 a 22 − a 12 a 21 ) = ( a 00 + a 01 + a 02 ) ⋅ ( a 11 a 22 − a 12 a 21 ) = a 11 a 22 − a 12 a 21 \begin{aligned} det(A) &= a_{00} \cdot (a_{11}a_{22} - a_{12}a_{21}) + a_{01} \cdot ( a_{11}a_{22} - a_{12}a_{21}) + a_{02} \cdot ( a_{11}a_{22} - a_{12}a_{21}) \\ & = (a_{00} + a_{01} + a_{02})\cdot (a_{11}a_{22} - a_{12}a_{21}) \\ & = a_{11}a_{22} - a_{12}a_{21} \end{aligned} det(A)=a00(a11a22a12a21)+a01(a11a22a12a21)+a02(a11a22a12a21)=(a00+a01+a02)(a11a22a12a21)=a11a22a12a21

同理,消掉公式(12)中的 a 11 , a 21 a_{11}, a_{21} a11,a21可得:
d e t ( A ) = a 12 a 20 − a 10 a 22 det(A) = a_{12}a_{20} - a_{10}a_{22} det(A)=a12a20a10a22

消掉公式(12)中的 a 12 , a 22 a_{12}, a_{22} a12,a22可得

d e t ( A ) = a 10 a 21 − a 11 a 20 det(A) = a_{10}a_{21} - a_{11}a_{20} det(A)=a10a21a11a20

即在条件(7)约束下,行列式的值可以表达为:
d e t ( A ) = a 11 a 22 − a 12 a 21 = a 12 a 20 − a 10 a 22 = a 10 a 21 − a 11 a 20 (14) \begin{aligned} det(A) &= a_{11}a_{22} - a_{12}a_{21} \\ &= a_{12}a_{20} - a_{10}a_{22} \\ &= a_{10}a_{21} - a_{11}a_{20} \end{aligned} \tag{14} det(A)=a11a22a12a21=a12a20a10a22=a10a21a11a20(14)

所以逆矩阵公式(13)第一列所有值都是1。

另外把公式(6)代入(14)可得:

d e t ( A ) = U m V m W G (15) det(A) = U_mV_mW_G \tag{15} det(A)=UmVmWG(15)

其他系数

结合公式(6)和(13),把其他系数都求出来:

c 01 = 1 d e t ( A ) ( a 01 a 12 − a 02 a 11 ) = 1 U m V m W G ( W B ( − V m W G ) − W G ( − V m W B ) ) = 0 \begin{aligned} c_{01} &= \frac{1}{det(A)} (a_{01}a_{12} - a_{02}a_{11}) \\[2ex] &= \frac{1}{U_mV_mW_G} (W_B(-V_mW_G)-W_G(-V_mW_B)) \\[2ex] &=0 \end{aligned} c01=det(A)1(a01a12a02a11)=UmVmWG1(WB(VmWG)WG(VmWB))=0

c 02 = 1 d e t ( A ) ( a 01 a 12 − a 02 a 11 ) = 1 U m V m W G ( W G U m ( 1 − W B ) + W B U m W G ) = 1 U m V m W G W G U m = 1 V m = 1 − W R V m a x \begin{aligned} c_{02} &= \frac{1}{det(A)} (a_{01}a_{12} - a_{02}a_{11}) \\[2ex] &= \frac{1}{U_mV_mW_G} (W_GU_m(1-W_B)+W_BU_mW_G) \\[2ex] &= \frac{1}{U_mV_mW_G} W_GU_m \\[2ex] &= \frac{1}{V_m} \\[2ex] &= \frac{1-W_R}{V_{max}} \end{aligned} c02=det(A)1(a01a12a02a11)=UmVmWG1(WGUm(1WB)+WBUmWG)=UmVmWG1WGUm=Vm1=Vmax1WR

c 11 = 1 d e t ( A ) ( a 00 a 22 − a 02 a 20 ) = 1 U m V m W G ( − W R V m W B − W B V m ( 1 − W R ) ) = 1 U m V m W G ( − W B V m ) = − W B U m W G = − W B ( 1 − W B ) W G U m a x \begin{aligned} c_{11} &= \frac{1}{det(A)} (a_{00}a_{22} - a_{02}a_{20}) \\[2ex] &= \frac{1}{U_mV_mW_G} (-W_RV_mW_B-W_BV_m(1-W_R)) \\[2ex] &= \frac{1}{U_mV_mW_G} (-W_BV_m) \\[2ex] &= -\frac{W_B}{U_mW_G} \\[2ex] &= -\frac{W_B(1-W_B)}{W_GU_{max}} \end{aligned} c11=det(A)1(a00a22a02a20)=UmVmWG1(WRVmWBWBVm(1WR))=UmVmWG1(WBVm)=UmWGWB=WGUmaxWB(1WB)

c 12 = 1 d e t ( A ) ( a 02 a 10 − a 00 a 12 ) = 1 U m V m W G ( − W B U m W R − W R U m ( 1 − W B ) ) = 1 U m V m W G ( − W R U m ) = − W R V m W G = − W R ( 1 − W R ) W G V m a x \begin{aligned} c_{12} &= \frac{1}{det(A)} (a_{02}a_{10} - a_{00}a_{12}) \\[2ex] &= \frac{1}{U_mV_mW_G} (-W_BU_mW_R-W_RU_m(1-W_B)) \\[2ex] &= \frac{1}{U_mV_mW_G} (-W_RU_m) \\[2ex] &= -\frac{W_R}{V_mW_G} \\[2ex] &= -\frac{W_R(1-W_R)}{W_GV_{max}} \end{aligned} c12=det(A)1(a02a10a00a12)=UmVmWG1(WBUmWRWRUm(1WB))=UmVmWG1(WRUm)=VmWGWR=WGVmaxWR(1WR)

c 21 = 1 d e t ( A ) ( a 01 a 20 − a 00 a 21 ) = 1 U m V m W G ( W G V m ( 1 − W R ) + W R V m W G ) = 1 U m V m W G W G V m = 1 U m = 1 − W B U m a x \begin{aligned} c_{21} &= \frac{1}{det(A)} (a_{01}a_{20} - a_{00}a_{21}) \\[2ex] &= \frac{1}{U_mV_mW_G} (W_GV_m(1-W_R)+W_RV_mW_G) \\[2ex] &= \frac{1}{U_mV_mW_G} W_GV_m \\[2ex] &= \frac{1}{U_m} \\[2ex] &= \frac{1-W_B}{U_{max}} \end{aligned} c21=det(A)1(a01a20a00a21)=UmVmWG1(WGVm(1WR)+WRVmWG)=UmVmWG1WGVm=Um1=Umax1WB

c 22 = 1 d e t ( A ) ( a 00 a 11 − a 01 a 10 ) = 1 U m V m W G ( W R ( − U m W G ) − W G ( − U m W R ) ) = 0 \begin{aligned} c_{22} &= \frac{1}{det(A)} (a_{00}a_{11} - a_{01}a_{10}) \\[2ex] &= \frac{1}{U_mV_mW_G} (W_R(-U_mW_G) - W_G(-U_mW_R)) \\[2ex] &= 0 \end{aligned} c22=det(A)1(a00a11a01a10)=UmVmWG1(WR(UmWG)WG(UmWR))=0

求解三个矩阵的乘

现在把三个转换矩阵重新罗列如下:

M R G B 2 Y U V M_{RGB2YUV} MRGB2YUV
[ Y U V ] = [ W R W G W B − U m W R − U m W G U m ( 1 − W B ) V m ( 1 − W R ) − V m W G − V m W B ] [ R G B ] \begin{bmatrix} Y \\ U \\ V \end{bmatrix}= \begin{bmatrix} W_R & W_G & W_B \\ -U_mW_R & -U_mW_G & U_m(1-W_B) \\ V_m(1-W_R) & -V_mW_G & -V_mW_B \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} YUV = WRUmWRVm(1WR)WGUmWGVmWGWBUm(1WB)VmWB RGB

M Y U V 2 R G B M_{YUV2RGB} MYUV2RGB
[ R G B ] = [ 1 0 1 V m 1 − W B U m W G − W R V m W G 1 1 U m 0 ] [ Y U V ] \begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} 1 & 0 & \frac{1}{V_m} \\[2ex] 1 & -\frac{W_B}{U_mW_G} & -\frac{W_R}{V_mW_G} \\[2ex] 1 & \frac{1}{U_m} & 0 \end{bmatrix} \begin{bmatrix} Y \\ U \\ V \end{bmatrix} RGB = 1110UmWGWBUm1Vm1VmWGWR0 YUV

R Y U V R_{YUV} RYUV

[ Y ′ U ′ V ′ ] = [ 1 0 0 0 c o s θ − s i n θ 0 s i n θ c o s θ ] [ Y U V ] \begin{bmatrix} Y' \\ U' \\ V' \end{bmatrix}= \begin{bmatrix} 1 & 0 & 0\\ 0 & cos{\theta} & -sin{\theta} \\ 0 & sin{\theta} & cos{\theta} \end{bmatrix} \begin{bmatrix} Y \\ U \\ V \end{bmatrix} YUV = 1000cosθsinθ0sinθcosθ YUV

然后可以求出整体的转换矩阵(暴力计算):
M = M Y U V 2 R G B R U V M R G B 2 Y U V = [ 1 0 1 V m 1 − W B U m W G − W R V m W G 1 1 U m 0 ] [ 1 0 0 0 c o s θ − s i n θ 0 s i n θ c o s θ ] [ W R W G W B − U m W R − U m W G U m ( 1 − W B ) V m ( 1 − W R ) − V m W G − V m W B ] = [ 1 0 1 V m 1 − W B U m W G − W R V m W G 1 1 U m 0 ] [ W R W G W B − U m W R c o s θ − V m ( 1 − W R ) s i n θ − U m W G c o s θ + V m W G s i n θ U m ( 1 − W B ) c o s θ + V m W B s i n θ − U m W R s i n θ + V m ( 1 − W R ) c o s θ − U m W G s i n θ − V m W G c o s θ U m ( 1 − W B ) s i n θ − V m W B c o s θ ] \begin{aligned} M &= M_{YUV2RGB} R_{UV} M_{RGB2YUV} \\[2ex] &= \begin{bmatrix} 1 & 0 & \frac{1}{V_m} \\[2ex] 1 & -\frac{W_B}{U_mW_G} & -\frac{W_R}{V_mW_G} \\[2ex] 1 & \frac{1}{U_m} & 0 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & cos{\theta} & -sin{\theta} \\ 0 & sin{\theta} & cos{\theta} \end{bmatrix} \begin{bmatrix} W_R & W_G & W_B \\ -U_mW_R & -U_mW_G & U_m(1-W_B) \\ V_m(1-W_R) & -V_mW_G & -V_mW_B \end{bmatrix} \\[8ex] &= \begin{bmatrix} 1 & 0 & \frac{1}{V_m} \\[2ex] 1 & -\frac{W_B}{U_mW_G} & -\frac{W_R}{V_mW_G} \\[2ex] 1 & \frac{1}{U_m} & 0 \end{bmatrix} \begin{bmatrix} W_R & W_G & W_B \\ -U_mW_Rcos{\theta} - V_m(1-W_R)sin{\theta} & -U_mW_Gcos{\theta} + V_mW_Gsin{\theta} & U_m(1-W_B)cos{\theta} + V_mW_Bsin{\theta} \\ -U_mW_Rsin{\theta} + V_m(1-W_R)cos{\theta} & -U_mW_Gsin{\theta} - V_mW_Gcos{\theta} & U_m(1-W_B)sin{\theta} - V_mW_Bcos{\theta} \end{bmatrix} \\[8ex] \end{aligned} M=MYUV2RGBRUVMRGB2YUV= 1110UmWGWBUm1Vm1VmWGWR0 1000cosθsinθ0sinθcosθ WRUmWRVm(1WR)WGUmWGVmWGWBUm(1WB)VmWB = 1110UmWGWBUm1Vm1VmWGWR0 WRUmWRcosθVm(1WR)sinθUmWRsinθ+Vm(1WR)cosθWGUmWGcosθ+VmWGsinθUmWGsinθVmWGcosθWBUm(1WB)cosθ+VmWBsinθUm(1WB)sinθVmWBcosθ

最终矩阵太长了,以 m 00 , m 01 , . . . , m 22 m_{00}, m_{01}, ..., m_{22} m00,m01,...,m22来表示矩阵的各项,计算过程中注意使用 W R + W G + W B = 1 W_R+W_G+W_B=1 WR+WG+WB=1 这个条件,结果如下:
m 00 = W R + ( 1 − W R ) c o s θ − U m V m W R s i n θ m 01 = W G − W G c o s θ − U m V m W G s i n θ m 02 = W B − W B c o s θ + U m V m ( 1 − W B ) s i n θ m 10 = W R − W R c o s θ + V m 2 W B ( 1 − W R ) + U m 2 W R 2 U m V m W G s i n θ m 11 = W G + ( 1 − W G ) c o s θ + U m 2 W R − V m 2 W B U m V m s i n θ m 12 = W B − W B c o s θ − V m 2 W B 2 + U m 2 W R ( 1 − W B ) U m V m W G s i n θ m 20 = W R − W R c o s θ − V m U m ( 1 − W R ) s i n θ m 21 = W G − W G c o s θ + V m U m W G s i n θ m 22 = W B + ( 1 − W B ) c o s θ + V m U m W B s i n θ (16) \begin{aligned} m_{00} &= W_R + (1-W_R)cos{\theta} - \frac{U_m}{V_m}W_Rsin{\theta} \\[2ex] m_{01} &= W_G - W_Gcos{\theta} - \frac{U_m}{V_m}W_Gsin{\theta} \\[2ex] m_{02} &= W_B - W_Bcos{\theta} + \frac{U_m}{V_m} (1-W_B)sin{\theta} \\[3ex] m_{10} &= W_R - W_Rcos{\theta}+\frac{V_m^2W_B(1-W_R)+U_m^2W_R^2}{U_mV_mW_G}sin{\theta} \\[3ex] m_{11} &= W_G + (1-W_G)cos{\theta} + \frac{U_m^2W_R-V_m^2W_B}{U_mV_m}sin{\theta}\\[3ex] m_{12} &= W_B-W_Bcos{\theta} - \frac{V_m^2W_B^2 + U_m^2W_R(1-W_B)}{U_mV_mW_G}sin{\theta} \\[3ex] m_{20} &= W_R-W_Rcos{\theta} - \frac{V_m}{U_m}(1-W_R)sin{\theta} \\[2ex] m_{21} &= W_G - W_Gcos{\theta} + \frac{V_m}{U_m}W_Gsin{\theta} \\[2ex] m_{22} &= W_B + (1-W_B)cos{\theta} + \frac{V_m}{U_m}W_B sin{\theta} \\[2ex] \end{aligned} \tag{16} m00m01m02m10m11m12m20m21m22=WR+(1WR)cosθVmUmWRsinθ=WGWGcosθVmUmWGsinθ=WBWBcosθ+VmUm(1WB)sinθ=WRWRcosθ+UmVmWGVm2WB(1WR)+Um2WR2sinθ=WG+(1WG)cosθ+UmVmUm2WRVm2WBsinθ=WBWBcosθUmVmWGVm2WB2+Um2WR(1WB)sinθ=WRWRcosθUmVm(1WR)sinθ=WGWGcosθ+UmVmWGsinθ=WB+(1WB)cosθ+UmVmWBsinθ(16)

观察易发现, c o s θ cos{\theta} cosθ的系数比较简单, s i n θ sin{\theta} sinθ的系数就麻烦一些。

未完待续。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

MySQL表的CURD

目录 一、Create 1.1单行数据全列插入 1.2多行数据指定列插入 1.3插入否则更新 1.4替换 2.Retrieve 2.1 select列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2where条件 2.3结果排序 2.4筛选分页结果 三…

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前,我们需要先弄清楚 3 个问题。第一,回收发生在哪里?第二,对象在 什么时候可以被回收?第三,如何回收这些对象? 回收发生在哪里? JVM 的内存区域中&…

基于SpringBoot的体检预约管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

PostgreSQL / PostGIS:创建地理要素

PostGIS详细教程可以参考官方文档:https://postgis.net/workshops/zh_Hans/postgis-intro/,并且官方文档提供了练习数据、教程、PPT版本教程。我这里参考QGIS文档中关于PostGIS的教程进行学习。 PostGIS 可以被认为是一组数据库内函数的集合&#xff0c…

embeddingbag词袋

文章目录 1. embeddingbag2. pytorch 1. embeddingbag 词袋embeddingbag 是在embedding词表的基础上演变起来的,nn.embedding的作用是构建一个词表,通过输入index序号来索引词对应的词向量,是可以根据词索引index进行forward计算的,embeddin…

分享|通过Self-Instruct框架将语言模型与自生成指令对齐

结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限, 从而阻碍模型通用性的背景下, Self - Instruct 框架, 通过 自动生成 并 筛选指令数据 微调预训练语言模型, 有效提升了其指令遵循能…

无穿戴动捕数字人互动方案 展馆展览创新引擎,推动文旅数字化转型

随着经济社会的发展和文旅融合的加速推进,“博物馆热”已成为一种不可忽视的社会现象,成为文化领域最具潜力的增长点之一。在信息技术的迅猛推动下,科技赋能的博物馆展览日益受到公众的关注,其中,“元宇宙”等创新概念…

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录 前言一、Mybatis Generator简介二、Maven插件运行方式三、生成配置 generatorConfig.xml MyBatis3Simple风格MyBatis3风格MyBatis3DynamicSql风格 四、Java代码运行方式五、MGB生成全部表六、增加Ext包七、Git提交总结 前言 本文我们主要实战Mybatis官方的代码生成器…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数(C11起)默认移动赋值运算符(C11起)取地址及const取地址操作符重载取地址操作符重…

Ext文件系统

文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件,按照参…

免费接入DeepSeek等多种大模型

核心代码 import cn.hutool.core.collection.CollUtil; import com.tool4j.pasteshare.entity.params.AiParams; import com.tool4j.pasteshare.entity.params.Message; import com.tool4j.pasteshare.service.AiCompletionService; import com.tool4j.pasteshare.util.deepse…

PostIn简明安装教程(入门级)

PostIn是一款开源免费的接口管理工具,包含接口调试、接口文档设计、数据MOCK等模块,本文将介绍如何快速安装配置,以快速入门上手。 1、服务端安装 私有部署版本支持多种操作系统,包括 Linux、Docker、Windows及macOS,…

java Fx进阶操作

1.java Fx基本介绍 JavaFX是用于构建富互联网应用程序的Java库。 使用此库编写的应用程序可以跨多个平台一致运行。 使用JavaFX开发的应用程序可以在各种设备上运行,如台式计算机,手机,电视,平板电脑等。 要使用Java编程语言开…

java-重载与重写

介绍 在 Java 中,重载(Overloading) 和 重写(Overriding) 是两个重要的概念,它们都与方法有关,但它们的应用场景和行为完全不同。 通过理解重载和重写的区别,可以更好地设计类的继承…

数据库系统概念第六版记录 一

1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…

嵌入式工程师必学(143):模拟信号链基础

概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…

2.5学习

misc buuctf-假如给我三天光明 下载附件后得到了一个压缩包和一个图片,压缩包为加密压缩包,需要解出密码,然后注意到这个图片并非简单的一个封面,在下方还有诸多点,有黑有灰。经过搜索,发现这是盲文通过与…

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别? (1)变量 定义不仅告知编译器变量的类型和名字,还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型,但并不为它分配内存空间…