微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > 算法(四):HSV颜色空间

算法(四):HSV颜色空间

时间:10-02 整理:3721RD 点击:

HSV颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。



与HSV相似的还有HSL。

HSV各代表的含意是:色调H、饱和度S、明度V。

HSL 和 HSV 在数学上定义为在 RGB 空间中的颜色的 R, GB 的坐标的变换。




对于HLV空间的定义,H是相同的,不同的是L与V;



计算的原始数据是24位图片的数据区数据,而不是8位或24位的灰度图片。

测试时,有些地方可能分配的内存大小与我的图片一至,有些地方没有更改成自动获取文件大小,使用时要注意一下。

对于每个像素进行HVS计算的程序如下,可以看出是完全按上面的公式进行的翻译,并没有做一些优化,在实际使用时,要做一些计算上的简化与优化,以提高效率。程序中使用了TI的VLI库,在使用时注意。


  1. float min, max, delta;
  2.     HSV_STRUCT result;
  3.     min = MIN( r, MIN( g, b ));
  4.     max = MAX( r, MAX( g, b ));
  5.     delta = max - min;

  6.     result.v = max;


  7.     if( max == 0 )
  8.             result.s = 0.0f;
  9.     else {

  10.             result.s = delta / max;

  11.     }

  12.         if ((r == max) && (g >= b))
  13.                 result.h = 60.0f * (g - b) / delta;             // between yellow & magenta
  14.         else if ((r == max) && (g < b))
  15.                 result.h = 60.0f * (g - b) / delta + 360.0f;
  16.         else if (g == max)
  17.                 result.h = 60.0f * (b - r) / delta + 120.0f; // between cyan & yellow
  18.         else if (b == max)
  19.                 result.h = 60.0f * (r - g) / delta + 240.0f; // between magenta & cyan
  20.         else if (max==min)
  21.                 result.h=0;
  22.     //result.h *= 60;               // degrees
  23.    // if( result.h < 0 )
  24.             //result.h += 360;
  25.     return result;

复制代码


计算出了所有的hvs值后,就是进行过滤了,先以蓝色的车牌为例,过滤掉所有非蓝色的颜色,只保留有用的颜色,最后的效果图如下:



最后和源码与二进制文件会在最后的结项中。

这里是调用了VLIB的什么函数?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top