一 疑问
最近在做相关图片通道从RGB转到HSV时一直存在疑问?在网上找的计算公式都是说:
色调H:0°~360°;
饱和度S:0.0~1.0;
亮度V:0.0~1.0。
但计算公式中:V=max(R,G,B),那V的范围应该是0~255才对啊,怎么会是0-1呢?
另外,OpenCV给出的范围分别如下,怎么和计算公式的范围又不一样呢?
H: 0 — 180
S: 0 — 255
V: 0 — 255
下面就来一一解答上面两个疑问
二 解答
疑问一:V的范围到底是0~255,还是0-1呢?
国内网站上很多博主给出的计算公式其实是不全的,如果你查查OpenCV的官网就会发现,标准计算公式中一开始是把RGB三通道进行了归一化,也就是将R、G、B的值分别归一化到0–1的范围,正确的计算公式如下:
所以V的取值范围是0–1
疑问二:OpenCV给出的范围为什么和计算公式不一样?
其实,计算公式的后面已经给出了答案,OpenCV中图片存储的深度是8位整数的,0-255之间,所以对计算公式的结果又进行了变换,使HSV的范围在0~255之间。为什么H通道的0-180呢?因为计算公式中H的范围已经在0-360了,所以直接除以了2,使范围缩小在0-180之间就行了。
三 Python代码实现RGB转HSV
from cv2 import cv2
import numpy as np
img0 = cv2.imread('2.jpg')
hsv_img = cv2.cvtColor(img0, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv_img) #这是OpenCV给出的范围
'''转换为计算公式给出的范围'''
H = h.astype(np.float)*2
S = s.astype(np.float)/255
V = v.astype(np.float)/255