RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
 

以下转自由RGB到HSV颜色空间的理解

在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解。

而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色、深浅如何、明暗如何。

1. RGB模型。

三维坐标:

 

原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。

用RGB来理解色彩、深浅、明暗变化:

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

PS: 光学的分析

三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。

只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”

 

2. HSV模型

倒锥形模型:

 

这个模型就是按色彩、深浅、明暗来描述的。

H是色彩

S是深浅, S = 0时,只有灰度

V是明暗,表示色彩的明亮程度,但与光强无直接联系,(意思是有一点点联系吧)。

 

3. RGB与HSV的联系

从上面的直观的理解,把RGB三维坐标的中轴线立起来,并扁化,就能形成HSV的锥形模型了。

但V与强度无直接关系,因为它只选取了RGB的一个最大分量。而RGB则能反映光照强度(或灰度)的变化。

v = max(r, g, b)

由RGB到HSV的转换:

 

HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。

 

4. HSV在图像处理应用

HSV在用于指定颜色分割时,有比较大的作用。

H和S分量代表了色彩信息。

分割应用:

      用H和S分量来表示颜色距离,颜色距离指代表两种颜色之间的数值差异。
     Androutsos等人通过实验对HSV颜色空间进行了大致划分,亮度大于75%并且饱和度大于20%为亮彩色区域,亮度小于25%为黑色区域,亮度大于75%并且饱和度小于20%为白色区域,其他为彩色区域。

   对于不同的彩色区域,混合H与S变量,划定阈值,即可进行简单的分割。

2001年的论文《Improving Shadow Suppression in Moving Object Detection with HSV Color Information》中提出将HSV色彩空间用于阴影检测。估通过估计阴影遮挡造成的HSV值的改变,来区分移动投射阴影和移动物体点。
基本算法如下,其中Ik和Bk分别是当前图像和背景图像对应像素的HSV分量,α,β,TS和TH分别表示亮度、饱和度、色度分量的阈值,并且0<α<1,0<β≤1,得到的SP k (x, y)结果为正则归于阴影。

 

 

前面是matplotlib.colors自带的函数,后面是根据公式的实现。

  1. # coding: utf8
  2. import numpy as np
  3. def rgb_to_hsv(arr):
  4. """
  5. convert float rgb values (in the range [0, 1]), in a numpy array to hsv
  6. values.
  7. Parameters
  8. ----------
  9. arr : (..., 3) array-like
  10. All values must be in the range [0, 1]
  11. Returns
  12. -------
  13. hsv : (..., 3) ndarray
  14. Colors converted to hsv values in range [0, 1]
  15. """
  16. # make sure it is an ndarray
  17. arr = np.asarray(arr)
  18. # check length of the last dimension, should be _some_ sort of rgb
  19. if arr.shape[-1] != 3:
  20. raise ValueError("Last dimension of input array must be 3; "
  21. "shape {shp} was found.".format(shp=arr.shape))
  22. in_ndim = arr.ndim
  23. if arr.ndim == 1:
  24. arr = np.array(arr, ndmin=2)
  25. # make sure we don\'t have an int image
  26. if arr.dtype.kind in (\'iu\'):
  27. arr = arr.astype(np.float32)
  28. out = np.zeros_like(arr)
  29. arr_max = arr.max(-1)
  30. ipos = arr_max > 0
  31. delta = arr.ptp(-1)
  32. s = np.zeros_like(delta)
  33. s[ipos] = delta[ipos] / arr_max[ipos]
  34. ipos = delta > 0
  35. # red is max
  36. idx = (arr[..., 0] == arr_max) & ipos
  37. out[idx, 0] = (arr[idx, 1] - arr[idx, 2]) / delta[idx]
  38. # green is max
  39. idx = (arr[..., 1] == arr_max) & ipos
  40. out[idx, 0] = 2. + (arr[idx, 2] - arr[idx, 0]) / delta[idx]
  41. # blue is max
  42. idx = (arr[..., 2] == arr_max) & ipos
  43. out[idx, 0] = 4. + (arr[idx, 0] - arr[idx, 1]) / delta[idx]
  44. out[..., 0] = (out[..., 0] / 6.0) % 1.0
  45. out[..., 1] = s
  46. out[..., 2] = arr_max
  47. if in_ndim == 1:
  48. out.shape = (3,)
  49. return out
  50. def hsv_to_rgb(hsv):
  51. """
  52. convert hsv values in a numpy array to rgb values
  53. all values assumed to be in range [0, 1]
  54. Parameters
  55. ----------
  56. hsv : (..., 3) array-like
  57. All values assumed to be in range [0, 1]
  58. Returns
  59. -------
  60. rgb : (..., 3) ndarray
  61. Colors converted to RGB values in range [0, 1]
  62. """
  63. hsv = np.asarray(hsv)
  64. # check length of the last dimension, should be _some_ sort of rgb
  65. if hsv.shape[-1] != 3:
  66. raise ValueError("Last dimension of input array must be 3; "
  67. "shape {shp} was found.".format(shp=hsv.shape))
  68. # if we got pased a 1D array, try to treat as
  69. # a single color and reshape as needed
  70. in_ndim = hsv.ndim
  71. if in_ndim == 1:
  72. hsv = np.array(hsv, ndmin=2)
  73. # make sure we don\'t have an int image
  74. if hsv.dtype.kind in (\'iu\'):
  75. hsv = hsv.astype(np.float32)
  76. h = hsv[..., 0]
  77. s = hsv[..., 1]
  78. v = hsv[..., 2]
  79. r = np.empty_like(h)
  80. g = np.empty_like(h)
  81. b = np.empty_like(h)
  82. i = (h * 6.0).astype(np.int)
  83. f = (h * 6.0) - i
  84. p = v * (1.0 - s)
  85. q = v * (1.0 - s * f)
  86. t = v * (1.0 - s * (1.0 - f))
  87. idx = i % 6 == 0
  88. r[idx] = v[idx]
  89. g[idx] = t[idx]
  90. b[idx] = p[idx]
  91. idx = i == 1
  92. r[idx] = q[idx]
  93. g[idx] = v[idx]
  94. b[idx] = p[idx]
  95. idx = i == 2
  96. r[idx] = p[idx]
  97. g[idx] = v[idx]
  98. b[idx] = t[idx]
  99. idx = i == 3
  100. r[idx] = p[idx]
  101. g[idx] = q[idx]
  102. b[idx] = v[idx]
  103. idx = i == 4
  104. r[idx] = t[idx]
  105. g[idx] = p[idx]
  106. b[idx] = v[idx]
  107. idx = i == 5
  108. r[idx] = v[idx]
  109. g[idx] = p[idx]
  110. b[idx] = q[idx]
  111. idx = s == 0
  112. r[idx] = v[idx]
  113. g[idx] = v[idx]
  114. b[idx] = v[idx]
  115. rgb = np.empty_like(hsv)
  116. rgb[..., 0] = r
  117. rgb[..., 1] = g
  118. rgb[..., 2] = b
  119. if in_ndim == 1:
  120. rgb.shape = (3, )
  121. return rgb
  122. def hsv2rgb(h, s, v):
  123. h60 = int(h * 6.0)
  124. hi = h60 % 6
  125. f = h *6.0 - h60
  126. p = v * (1.0 - s)
  127. q = v * (1.0 - f * s)
  128. t = v * (1.0 - (1.0 - f) * s)
  129. if hi == 0:
  130. return v, t, p
  131. elif hi == 1:
  132. return q, v, p
  133. elif hi == 2:
  134. return p, v, t
  135. elif hi == 3:
  136. return p, q, v
  137. elif hi == 4:
  138. return t, p, v
  139. else: # hi == 5:
  140. return v, p, q
  141. def rgb2hsv(r, g, b):
  142. mx = np.max([r, g, b])
  143. mn = np.min([r, g, b])
  144. df = mx-mn
  145. if mx == mn:
  146. h = 0.0
  147. elif mx == r:
  148. h = (((g-b)/df))
  149. elif mx == g:
  150. h = (((b-r)/df) + 2.0)
  151. else: # mx == b
  152. h = (((r-g)/df) + 4.0)
  153. if mx == 0:
  154. s = 0.0
  155. else:
  156. s = df/mx
  157. h = h/6.0%1.0
  158. v = mx
  159. return h, s, v
  160. if __name__ == "__main__":
  161. for r,g,b in np.random.rand(10,3):
  162. h,s,v= rgb_to_hsv((r,g,b))
  163. h1,s1,v1=rgb2hsv(r, g, b)
  164. r,g,b = hsv_to_rgb((h,s,v))
  165. r1,g1,b1= hsv2rgb(h,s,v)
  166. print [h,s,v,r,g,b]==[h1,s1,v1,r1,g1,b1]
  167. """
  168. True
  169. True
  170. True
  171. True
  172. True
  173. True
  174. True
  175. True
  176. True
  177. True
  178. """

 

 

 

 

 

 

版权声明:本文为qw12原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/qw12/p/9503152.html