HSV颜色空间

原文地址:http://baike.baidu.com/subview/541362/8445478.htm?fromId=541362&from=rdtself

1HSV颜色模型

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
HSV颜色空间模型

HSV颜色空间模型[1]

色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S:取值范围为0.0~1.0;
亮度V:取值范围为0.0(黑色)~1.0(白色)。
RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。
HSV六棱锥
H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰
HSV颜色空间模型

HSV颜色空间模型[2]

度。相隔120度。互补色分别相差180度。
V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。
RGB转化到HSV的算法
max=max (R ,G ,B ):
min=min (R ,G ,B )
V=max (R ,G ,B )
S= (max-min )/max:
HSV颜色空间模型(圆锥模型)

HSV颜色空间模型(圆锥模型)[3]

ifR = max ,H = (G-B )/ (max-min )* 60
ifG = max ,H = 120+ (B-R )/ (max-min )* 60
ifB = max ,H = 240 + (R-G )/ (max-min )* 60
ifH < 0 ,H = H+ 360
HSV转化到RGB的算法
if s = 0
R=G=B=V
else
H /= 60;
i = INTEGER(H)
f = H - i
a = V * ( 1 - s )
b = V * ( 1 - s * f )
c = V * ( 1 - s * (1 - f ) )
switch(i)
case 0: R = V; G = c; B = a;
case 1: R = b; G = v; B = a;
case 2: R = a; G = v; B = c;
case 3: R = a; G = b; B = v;
case 4: R = c; G = a; B = v;
case 5: R = v; G = a; B = b;
HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。
一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以满足我们的需要了。
由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
红色的HSV范围可以根据实际情况进行调整,但通常情况下可以使用以下范围: - 红色范围1:H为0-10,S为70-255,V为70-255 - 红色范围2:H为156-180,S为70-255,V为70-255 以下是使用OpenCV的代码示例,实现红色的提取: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像并转换为HSV颜色空间 Mat image = imread("test.jpg"); Mat hsvImage; cvtColor(image, hsvImage, COLOR_BGR2HSV); // 定义红色的HSV范围 Scalar lowerRed1(0, 70, 70); Scalar upperRed1(10, 255, 255); Scalar lowerRed2(156, 70, 70); Scalar upperRed2(180, 255, 255); // 提取红色部分 Mat redMask1, redMask2, redMask; inRange(hsvImage, lowerRed1, upperRed1, redMask1); inRange(hsvImage, lowerRed2, upperRed2, redMask2); redMask = redMask1 | redMask2; // 形态学操作 Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5)); morphologyEx(redMask, redMask, MORPH_OPEN, kernel); // 轮廓检测 vector<vector<Point>> contours; findContours(redMask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 筛选轮廓 vector<vector<Point>> redContours; for (int i = 0; i < contours.size(); i++) { double area = contourArea(contours[i]); if (area > 1000) { redContours.push_back(contours[i]); } } // 绘制轮廓 Mat result = image.clone(); drawContours(result, redContours, -1, Scalar(0, 0, 255), 2); // 显示结果 imshow("image", image); imshow("result", result); waitKey(0); return 0; } ``` 其中test.jpg是需要进行红色识别的图像,可以根据实际情况进行修改。在代码中,提取红色部分使用了inRange函数,形态学操作使用了morphologyEx函数,轮廓检测使用了findContours函数,轮廓筛选使用了contourArea函数。最终结果会在result窗口中显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值