算法(四):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, G 和 B 的坐标的变换。
对于HLV空间的定义,H是相同的,不同的是L与V;
计算的原始数据是24位图片的数据区数据,而不是8位或24位的灰度图片。
测试时,有些地方可能分配的内存大小与我的图片一至,有些地方没有更改成自动获取文件大小,使用时要注意一下。
对于每个像素进行HVS计算的程序如下,可以看出是完全按上面的公式进行的翻译,并没有做一些优化,在实际使用时,要做一些计算上的简化与优化,以提高效率。程序中使用了TI的VLI库,在使用时注意。
- float min, max, delta;
- HSV_STRUCT result;
- min = MIN( r, MIN( g, b ));
- max = MAX( r, MAX( g, b ));
- delta = max - min;
- result.v = max;
- if( max == 0 )
- result.s = 0.0f;
- else {
- result.s = delta / max;
- }
- if ((r == max) && (g >= b))
- result.h = 60.0f * (g - b) / delta; // between yellow & magenta
- else if ((r == max) && (g < b))
- result.h = 60.0f * (g - b) / delta + 360.0f;
- else if (g == max)
- result.h = 60.0f * (b - r) / delta + 120.0f; // between cyan & yellow
- else if (b == max)
- result.h = 60.0f * (r - g) / delta + 240.0f; // between magenta & cyan
- else if (max==min)
- result.h=0;
- //result.h *= 60; // degrees
- // if( result.h < 0 )
- //result.h += 360;
- return result;
计算出了所有的hvs值后,就是进行过滤了,先以蓝色的车牌为例,过滤掉所有非蓝色的颜色,只保留有用的颜色,最后的效果图如下:
最后和源码与二进制文件会在最后的结项中。
这里是调用了VLIB的什么函数?