原始的双循环写法. 比较耗时
#将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
怎么样? 还是亚洲美女更好看吧… 同意的请举个手.