RGB颜色空间转换至HSV颜色空间
2013-04-04 22:58
381 查看
经常用opencv下的cvCvtColor函数直接把图片颜色空间转换到了HSV下,今天自己写了一段代码进行转化,RGB转HSV的计算公式如下:
在这里把h规范化到位于 0 到 360°之间,s和v均规范化到0-1之间,和opencv的范围不同。
在这里把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;
相关文章推荐
- 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图
- HSV颜色空间 与 RGB 颜色空间的相互转换
- YUV到RGB颜色空间转换
- 图像的RGB颜色空间和HSI空间的转换
- 颜色空间RGB与HSV(HSL)的转换
- 颜色空间RGB 与 HSL 空间转换代码
- RGB与YCbCr颜色空间的转换
- 颜色空间转换(YUV,RGB)
- Java 利用 ICC 色彩空间 color space profile 实现 RGB 和 CMYK 颜色的相互转换
- RGB与YCbCr颜色空间的转换
- RGB颜色空间到HSV和YUV的转换关系(含VC代码)
- RGB与YCbCr颜色空间的转换
- 颜色空间RGB与HSV(HSL)的转换
- RGB至其它颜色空间转换公式
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- 转:RGB与YCbCr颜色空间的转换(高精度测试)
- 颜色空间系列1: RGB和CIEXYZ颜色空间的转换及相关优化
- 颜色空间RGB与HSV(HSL)的转换
- HSI颜色空间和RGB颜色空间之间的相互转换
- 颜色空间系列3: RGB和YCbCr颜色空间的转换及优化算法