python 替代for循环的列表生成式 RGB2HSV

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

#将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)通道,
在这里插入图片描述
饱和度(S)通道,
在这里插入图片描述
明度(V)通道
在这里插入图片描述

感觉还是我们亚洲的美女好看哈, 比美国的哪个莱娜(Lena)要好看多了, 也许是我们亚洲人的审美观不同哈.
在这里插入图片描述
嗯嗯嗯 放个大 Lena 原图在此,拿好不谢~,http://www.lenna.org/full/l_hires.jpg

怎么样? 还是亚洲美女更好看吧… 同意的请举个手.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值