一:RGB与HSV的基础知识。

1:网上很多关于RGB和HSV的介绍,随便都能搜到,这里就不在详细介绍。

二:RGB与HSV的转换关系。

1:首先根据网上RGB和HSV转换公式(参考:)写了一个QT应用程序,用来便于观察RGB和HSV的变换关系。界面如下,只要鼠标滚动任何一个数值,别的数值和下图颜色就会跟着变化。

rgb hsv转换 python rgbhv转rgbs_hsv

2:先用画图简单画一个最外围色环变化。

rgb hsv转换 python rgbhv转rgbs_距离计算_02

3:试图从RGB分析颜色。

从红色开始H 从0变到了360。RGB分量的值依次增加/减少。这样我们就得出了一个简单的根据RGB判断颜色的方法。我不太会用语言描述,那就举例分析。

举例:例如颜色(R=80,G=100,B=240)

首先根据B最大,判断颜色在蓝色附近,再根据G第二大,判断颜色偏向绿色方向。那么这个颜色就是介于蓝色和青色之间。H值介于180和240之间。

根据最大亮度240,得出亮度有2/3。(240/360)

根据最大RGB之差,B-R=120。得出饱和度大概位于1/3处。(120/360)

当然这只是辅助理解,如果在程序中判断颜色,还是不建议用RGB判断。建议转换成HSV。

4:如何理解饱和度S。

采用控制变量法,让H=0,V=100固定,接着观察S变化 。

rgb hsv转换 python rgbhv转rgbs_G1_03

发现随着饱和度的降低,颜色越来越发白(别的颜色也是这样变化,懒得截图)。所以可以理解为S越小,颜色越发白。

根据RGB值的变化也能看出来,随着S的降低,G和B都升高,多出来的RGB混合成了白色,导致颜色越来越淡。

5:如何理解V。

根据公式就能看出来,V始终是RGB分量中的最大值转换÷2.55得出来的。

所以V越大越亮,V越小越黑。

三:色差检测

费力的分析颜色,自然是为了应用到实际中。

1:根据RGB检测色差。

rgb检测色差有着天然的劣势。因为往往一个通道的一点改变,会导致最后融合在一起的颜色发生变化,而如果三个通道的同时改变,却只会使最后的明暗发生变化,色调并不会产生大变化。

rgb计算色差没啥好说的,只需要记住采用欧式距离计算就行。精度比单纯的ABS(R1-R2)+ABS(G1-G2)+ABS(B1-B2)要高。

国外有大佬计算出了加权的RGB欧式距离计算色差公式,具体参考这个连接https://www.compuphase.com/cmetric.htm

C++代码如下

int computeColourDistance(int R1,int G1,int B1, int R2,int G2,int B2){
int delta = (R1 +R2 ) / 2;
int deltaR = R1 - R2;
int deltaG = G1 -G2;
int deltaB = B1 - B2;
return sqrt((2+delta/256)*(deltaR*deltaR)+4*(deltaG*deltaG)+(2+(255-delta)/256)*(deltaB*deltaB));
}

2:HSV色差检测。

色差检测一般都要转换成HSV计算。最简单的算法只要判断ABS(H1-H2)即可,也可以根据S和V辅助判断。

值得一提的是HSV空间是圆锥空间,计算色差参考。