代码通过判断颜色(RGB)值获得颜色的深浅

单纯通过颜色值的RGB值不能够得知颜色的深浅,简单的R+G+B判断是不可取的。上网搜索之后得知可以使用YUV颜色编码来判断颜色的深浅。

RGB是可以和YUV通过公式转换的,那么什么是YUV呢?

YUV,是一种颜色编码方法。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)。Y'UV 的发明是由于彩色电视与黑白电视的过渡时期。黑白视讯只有 Y(Luma,Luminance)视讯,也就是灰阶值。这里提到的就是我们儿时经常观看的黑白电视机的原理。彩色图像记录的格式,常见的有 RGB、YUV、CMYK等。彩色电视最早的构想是使用RGB三原色来同时传输。这种设计方式是原来黑白带宽的3倍,在当时并不是很好的设计。RGB 诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度,Y 代表的是亮度,UV 代表的是彩度(因此黑白电影可省略UV,相近于RGB),分别用Cr和Cb来表示,因此YUV的记录通常以 Y:UV 的格式呈现。

补充:CMYK是印刷颜色格式!
 

YUV 与 RGB 的转换公式:

 


\begin{array}{rll}
Y &= 0.299 * R + 0.587 * G + 0.114 * B \\
U &= 0.436 * (B - Y) / (1 - 0.114) \\
V &= 0.615 * (R - Y) / (1 - 0.299)
\end{array}

U 和 V 元件可以被表示成原始的 R、 G,和 B:


\begin{array}{rll}
Y &= 0.299 * R + 0.587 * G + 0.114 * B \\
U &= -0.14713 * R - 0.28886 * G + 0.436 * B \\
V &= 0.615 * R - 0.51499 * G - 0.10001 * B
\end{array}

如一般顺序,转移元件的范围可得到:


\begin{array}{rll}
Y & \in \left[0, 1\right] \\
U & \in \left[-0.436, 0.436\right] \\
V & \in \left[-0.615, 0.615\right]
\end{array}

在逆转关系上,从 YUV 到 RGB,可得


\begin{array}{rll}
R & = Y + 1.13983 * V \\
G & = Y - 0.39465 * U - 0.58060 * V \\
B & = Y + 2.03211 * U
\end{array}

取而代之,以矩阵表示法(matrix representation),可得到公式:


\begin{bmatrix} Y \\ U \\ V \end{bmatrix}
=
\begin{bmatrix} 0.299 & 0.587 & 0.114 \\ -0.14713 & -0.28886 & 0.436 \\ 0.615 & -0.51498 & -0.10001 \end{bmatrix}
\begin{bmatrix} R \\ G \\ B \end{bmatrix}


\begin{bmatrix} R \\ G \\ B \end{bmatrix}
=
\begin{bmatrix} 1 & 0 & 1.13983 \\ 1 & -0.39465 & -0.58060 \\ 1 & 2.03211 & 0 \end{bmatrix}
\begin{bmatrix} Y \\ U \\ V \end{bmatrix}

 

Y=0.299*R+0.587*G+0.114*B这个就是我们要找的颜色的深浅!

参考资料:http://zh.wikipedia.org/wiki/YUV

评论 (1) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. BarbieAnd I thought I was the sensible one. Thanks for setting me stiraght.