切脉时为什么是动脉:关于opencv中的颜色模型转换之cvCvtColor
来源:百度文库 编辑:偶看新闻 时间:2024/04/27 20:02:31
cvCvtColor(rgb_im,hsv_im,CV_BGR2HSV)针对8bit和32bit使用不同的计算公式,
代码中使用的公式:s = diff * div_table[v] >> hsv_shift; (在这里为了避免除法运算,将 [255/v << hsv_shift] 存在了div_table中,计算后再右移回去) 3、因为是8u类型,H不可能取值到360,故使用下面的公式将h计算到0-180范围内: h = (vr & (g - b)) +(~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff))));
h = ((h * div_table[diff] * 15 + (1 << (hsv_shift + 6))) >> (7 + hsv_shift))+ (h < 0 ? 30*6 : 0);
- 如果是8bit ,HSV的范围是:H(0-180) S(0-255) V(0-255)
代码中使用的公式:s = diff * div_table[v] >> hsv_shift; (在这里为了避免除法运算,将 [255/v << hsv_shift] 存在了div_table中,计算后再右移回去) 3、因为是8u类型,H不可能取值到360,故使用下面的公式将h计算到0-180范围内: h = (vr & (g - b)) +(~vr & ((vg & (b - r + 2 * diff)) + ((~vg) & (r - g + 4 * diff))));
h = ((h * div_table[diff] * 15 + (1 << (hsv_shift + 6))) >> (7 + hsv_shift))+ (h < 0 ? 30*6 : 0);
- 如果是32bit,需要在传入前将像素值归一化到0-1之间,此时HSV的范围是:H(0-360) S(0-1) V(0-1)
- 而opencv的手册上写的转换公式如下:
V=max(R,G,B)
S=(V-min(R,G,B))*255/V if V!=0, 0 otherwise
(G - B)*60/S, if V=R
H= 180+(B - R)*60/S, if V=G
240+(R - G)*60/S, if V=B
if H<0 then H=H+360