原始的双循环写法. 比较耗时

#将RGB色彩空间 转换成HSV色彩空间 
def ConvertRGB2HSV(image):
  w,h,c = image.shape
  newHSVImage = np.zeros((w,h,c), dtype=np.int)
  # print(newHSVImage.shape)

  for wi in range(0,w):
    for hi in range(0,h):
        ch,cs,cv = rgb2hsv(image[wi,hi])
        newHSVImage[wi,hi,0] = ch
        newHSVImage[wi,hi,1] = cs
        newHSVImage[wi,hi,2] = cv
 
  return newHSVImage

列表生成式的写法.很简洁, 但是不好懂,而且还需要再reshape 也比较慢. 还是opencv自带的哪个快. opencv是用c语言实现的. 内部应该也用过其它的优化算法. 我记得某位大神把几十秒的计算硬生生的优化到了几毫秒…就是关于色彩转换的, 当时是转灰度图.可惜找不到哪篇文章了.

#将RGB色彩空间 转换成HSV色彩空间 
def ConvertRGB2HSV(image):
  w,h,c = image.shape 
  newHSVImage = [ rgb2hsv(point) for row in image for point in row] 
  return np.array(newHSVImage).reshape(w,h,c)

当然追求极致的效率可以用opencv来实现

    cv2hsvimg = cv2.cvtColor(rgbTensorImage,cv2.COLOR_RGB2HSV)

补贴一下核心的rgb转hsv的代码. 感谢网友

###'''
### 根据rgb计算出对应的hsv色彩
###'''
# @jit(nopython=True)
def rgb2hsv(rgb): 
    r, g, b = rgb[0],rgb[1],rgb[2]
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    m = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        if g >= b:
            h = ((g-b)/m)*60
        else:
            h = ((g-b)/m)*60 + 360
    elif mx == g:
        h = ((b-r)/m)*60 + 120
    elif mx == b:
        h = ((r-g)/m)*60 + 240
    if mx == 0:
        s = 0
    else:
        s = m/mx
    v = mx
    return (h, s, v)

不知道为啥, 我生成出来的图片,色调竟然是这样的效果.也许是算的不对吧.
H,S,V效果如下,
色调(H)通道,
python 替代for循环的列表生成式 RGB2HSV_灰度图
饱和度(S)通道,
python 替代for循环的列表生成式 RGB2HSV_色彩空间_02
明度(V)通道
python 替代for循环的列表生成式 RGB2HSV_色彩空间_03

感觉还是我们亚洲的美女好看哈, 比美国的哪个莱娜(Lena)要好看多了, 也许是我们亚洲人的审美观不同哈.
python 替代for循环的列表生成式 RGB2HSV_优化算法_04
嗯嗯嗯 放个大 Lena 原图在此,拿好不谢~,http://www.lenna.org/full/l_hires.jpg

怎么样? 还是亚洲美女更好看吧… 同意的请举个手.
python 替代for循环的列表生成式 RGB2HSV_灰度图_05