您的位置:首页 > 其它

RGB颜色空间转换至HSV颜色空间

2013-04-04 22:58 381 查看
经常用opencv下的cvCvtColor函数直接把图片颜色空间转换到了HSV下,今天自己写了一段代码进行转化,RGB转HSV的计算公式如下:



在这里把h规范化到位于 0 到 360°之间,s和v均规范化到0-1之间,和opencv的范围不同。

IplImage * src;
int * h;
float * s;
float * v;

int width = src->width;
int height = src->height;

//分配内存
h = new int[width * height];
s = new float[width * height];
v = new float[width * height];

//初始化
for (int i = 0;i < width * height;i++)
{
h[i] = 0;
s[i] = 0;
v[i] = 0;
}

int width = src->width;
int height = src->height;

int k1,k2,r,g,b;
int ss;

uchar * data = (uchar *)src->imageData;
for (int i = 0;i < height;i++)
{
for (int j = 0;j < width;j++)
{
r = (int)data[i * src->widthStep + j];
k1 = r;
k2 = r;

g = (int)data[i * src->widthStep + j + 1];
if(k1 < g)k1 = g;
if(k2 > g)k2 = g;
b = (int)data[i * src->widthStep + j + 2];
if(k1 < b)k1 = b;
if(k2 > b)k2 = b;

//计算hsv分量
v[i * width + j] = k1 * 1.0 / 255;

if(k1 == 0)
s[i * width + j] = 0;
else
s[i * width + j] = 1.0 * (k1 - k2) / k1;

ss = s[i * width + j];
if(ss != 0 && k1 == r)
h[i * width + j] = 1.0 * abs(g - b) / (k1 - k2) * 60;
else if(ss != 0 && k1 == g)
h[i * width + j] = (2 + 1.0 * abs(b - r) / (k1 - k2)) * 60;
else if(ss != 0 && k1 == b)
h[i * width + j] = (4 + 1.0 * abs(r - g) / (k1 - k2)) * 60;
else if(ss == 0)
h[i * width + j] = -1;
}
}

delete []h;
delete []s;
delete []v;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: