HSV颜色模型


  这个模型中颜色的参数分别是:色彩(H),纯度(S),明度(V)。 

  HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。 

  HSV六棱锥 

  H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。互补色分别相差180度。 

  纯度S为一比例值,范围从01,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。 

  V表示色彩的明亮程度,范围从01。有一点要注意:它和光强度之间并没有直接的联系。 

  RGB转化到HSV的算法 

  max=max(R,G,B) 

  min=min(R,G,B) 

  if R = max, H = (G-B)/(max-min) 

  if G = max, H = 2 + (B-R)/(max-min) 

  if B = max, H = 4 + (R-G)/(max-min) 

  H = H * 60 

  if H < 0, H = H + 360 

  V=max(R,G,B) 

  S=(max-min)/max 

  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,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小VS不变,同样增加白色可以减小SV不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。 

  一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H4位存放S5位存放V,即745或者655就可以满足我们的需要了。 

  由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现。 

  顺便提一下,另外一种直观颜色模型是HSL模型,该模型中前两个参数和HSV一样,而L表示亮度。它的三维表示为一双棱锥。因为用的不多,这里就不详细讲了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是将RGB模型转换为HSV模型,并使用HSV模型定位灰度图中车牌的Matlab代码: ```matlab % 读取灰度图像 grayImg = imread('car_plate_gray.jpg'); % 将灰度图像转为RGB图像 rgbImg = cat(3, grayImg, grayImg, grayImg); % 将RGB图像转为HSV图像 hsvImg = rgb2hsv(rgbImg); % 提取亮度通道 value = hsvImg(:,:,3); % 对亮度通道进行二值化 threshold = graythresh(value); binaryImg = imbinarize(value, threshold); % 对二值化图像进行形态学处理 se = strel('rectangle', [4, 16]); binaryImg = imclose(binaryImg, se); % 找到所有连通区域 cc = bwconncomp(binaryImg); % 计算每个连通区域的宽高比 stats = regionprops(cc, 'BoundingBox'); ratios = zeros(cc.NumObjects, 1); for i = 1:cc.NumObjects bb = stats(i).BoundingBox; ratios(i) = bb(3) / bb(4); end % 找到宽高比最接近车牌的连通区域 [~, idx] = min(abs(ratios - 3)); plate = false(size(binaryImg)); plate(cc.PixelIdxList{idx}) = true; % 在原图像中显示车牌位置 figure; imshow(grayImg); hold on; bb = stats(idx).BoundingBox; rectangle('Position', [bb(1), bb(2), bb(3), bb(4)], 'EdgeColor', 'r', 'LineWidth', 2); ``` 这段代码将灰度图像转换为RGB图像,再将RGB图像转换为HSV图像。然后,提取HSV图像中的亮度通道,并对其进行二值化和形态学处理。接着,找到所有连通区域,并计算每个连通区域的宽高比。最后,找到宽高比最接近车牌的连通区域,并在原图像中显示车牌位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值