OpenCV中HSV颜色空间
2015-01-27 18:08
162 查看
opencv中实现BGR颜色空间想HSV颜色空间转换的是cvCvtColor
H通道的值范围为: 0-180
S: 0-255
V:0-255
后来发现了 CV_BGR2HSV_FULL ,
CV_BGR2HSV 在转换图像的时候是将 H / 2 ---> H ,我们知道图像中色相H的取值范围为 0-360 ,所以利用opencv转换之后得到的H的范围为 0-180
而 CV_BGR2HSV_FULL 实现的映射是 H * 255 / 360 --->H , 所以利用_FULL 这个转换得到的H通道图像的范围为 0-255
这两种方式都是opencv把[0-360] 的数据压缩到一个字节可以处理的数据。[ 所以这里说的图像的depth = 8, 刚好能表示的最大值是 255]
上面说的图像的 depth = 8, 如果你的图像 位深不是 8位,比如 32 位, 那么你就可以得到 [0, 360] 表示的 H通道图像了。
in fact, HSV颜色模型规定的各通道取值范围为:
H : 0-360 S:0-1 V: 0-1
可以利用 CV_BGR2HSV 得到的 H S V 的 S V /255 转换得到。
而HSV向RGB的转换参考百度百科:点击打开链接
下面的程序实现了使用opencv将RGB颜色空间的图像转换到HSV空间中,然后再依据百度百科中的公式将HSV转换回RGB,最后验证得到的RGB的值跟原图像中RGB的值是否相等。
程序如下:
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
//HSV颜色空间映射到RGB颜色空间
//RGB中val数组元素值均为0~1
CvScalar fun_hsv2rgb(CvScalar scalar)
{
double R, G, B;
CvScalar RGB = cvScalar(0, 0, 0);
if (abs(scalar.val[1])<=1e-8)
{
R = G = B = scalar.val[2];
}
else
{
int Hi = (int)abs(scalar.val[0] / 60.0);
double f = scalar.val[0] / 60.0 - Hi;
double a = scalar.val[2] * (1 - scalar.val[1]);
double b = scalar.val[2] * (1 - f*scalar.val[1]);
double c = scalar.val[2] * (1 - (1 - f)*scalar.val[1]);
switch (Hi)
{
case 0:
R = scalar.val[2];
G = c;
B = a;
break;
case 1:
R = b;
G = scalar.val[2];
B = a;
break;
case 2:
R = a;
G = scalar.val[2];
B = c;
break;
case 3:
R = a;
G = b;
B = scalar.val[2];
break;
case 4:
R = c;
G = a;
B = scalar.val[2];
break;
case 5:
R = scalar.val[2];
G = a;
B = b;
break;
default:
break;
}
}
RGB = cvScalar(R, G, B);
return RGB;
}
CvScalar transfor_bgr( CvScalar normal_rgb)
{
CvScalar cv_bgr;
int blue = int(normal_rgb.val[2] * 255+0.5);
int B = (blue > 255) ? 255 : blue;
B = (blue < 0) ? 0 : blue;
int green = int(normal_rgb.val[1] * 255+0.5);
int G = (green > 255) ? 255 : green;
G = (green < 0) ? 0 : green;
int red = int(normal_rgb.val[0] * 255+0.5);
int R = (red > 255) ? 255 : red;
R = (red < 0) ? 0 : red;
cv_bgr.val[0] = B;
cv_bgr.val[1] = G;
cv_bgr.val[2] = R;
return cv_bgr;
}
CvScalar transfor_HSV(CvScalar cv_hsv )
{
CvScalar normal_hsv;
normal_hsv.val[0] = cv_hsv.val[0] * 2;
normal_hsv.val[1] = (double)(cv_hsv.val[1] )/ 255;
normal_hsv.val[2] = (double)(cv_hsv.val[2]) / 255;
return normal_hsv;
}
int main()
{
IplImage* img_bgr = cvLoadImage("C:\\Users\\jiangpei-pc\\Desktop\\new\\lena.jpg");
IplImage* img_hsv = cvCreateImage(cvGetSize(img_bgr), 8, 3);
cvCvtColor(img_bgr, img_hsv, CV_BGR2HSV);
int width = img_bgr->width;
int height = img_bgr->height;
for (int i = 0; i < 350;i++)
{
CvScalar scalar_hsv = cvGet2D(img_hsv, 0, i);
CvScalar scalar_rgb = cvGet2D(img_bgr, 0, i);
CvScalar temp_hsv = cvScalar(0, 0, 0);
CvScalar compute_rgb = cvScalar(0, 0, 0);
CvScalar temp_rgb ;
temp_hsv=transfor_HSV(scalar_hsv );
temp_rgb = fun_hsv2rgb(temp_hsv);
compute_rgb=transfor_bgr(temp_rgb);
//cout << i << " row the H value is: " << scalar_hsv.val[0] << endl;
cout << i << " row the B value is: " << scalar_rgb.val[0] << endl;
cout << i << " row the compute B value is: " << compute_rgb.val[0] << endl;
}
cvNamedWindow("image", 1);
cvShowImage("image", img_hsv);
if (cvWaitKey()==27)
{
return 1;
}
}
H通道的值范围为: 0-180
S: 0-255
V:0-255
后来发现了 CV_BGR2HSV_FULL ,
CV_BGR2HSV 在转换图像的时候是将 H / 2 ---> H ,我们知道图像中色相H的取值范围为 0-360 ,所以利用opencv转换之后得到的H的范围为 0-180
而 CV_BGR2HSV_FULL 实现的映射是 H * 255 / 360 --->H , 所以利用_FULL 这个转换得到的H通道图像的范围为 0-255
这两种方式都是opencv把[0-360] 的数据压缩到一个字节可以处理的数据。[ 所以这里说的图像的depth = 8, 刚好能表示的最大值是 255]
上面说的图像的 depth = 8, 如果你的图像 位深不是 8位,比如 32 位, 那么你就可以得到 [0, 360] 表示的 H通道图像了。
in fact, HSV颜色模型规定的各通道取值范围为:
H : 0-360 S:0-1 V: 0-1
可以利用 CV_BGR2HSV 得到的 H S V 的 S V /255 转换得到。
而HSV向RGB的转换参考百度百科:点击打开链接
下面的程序实现了使用opencv将RGB颜色空间的图像转换到HSV空间中,然后再依据百度百科中的公式将HSV转换回RGB,最后验证得到的RGB的值跟原图像中RGB的值是否相等。
程序如下:
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
//HSV颜色空间映射到RGB颜色空间
//RGB中val数组元素值均为0~1
CvScalar fun_hsv2rgb(CvScalar scalar)
{
double R, G, B;
CvScalar RGB = cvScalar(0, 0, 0);
if (abs(scalar.val[1])<=1e-8)
{
R = G = B = scalar.val[2];
}
else
{
int Hi = (int)abs(scalar.val[0] / 60.0);
double f = scalar.val[0] / 60.0 - Hi;
double a = scalar.val[2] * (1 - scalar.val[1]);
double b = scalar.val[2] * (1 - f*scalar.val[1]);
double c = scalar.val[2] * (1 - (1 - f)*scalar.val[1]);
switch (Hi)
{
case 0:
R = scalar.val[2];
G = c;
B = a;
break;
case 1:
R = b;
G = scalar.val[2];
B = a;
break;
case 2:
R = a;
G = scalar.val[2];
B = c;
break;
case 3:
R = a;
G = b;
B = scalar.val[2];
break;
case 4:
R = c;
G = a;
B = scalar.val[2];
break;
case 5:
R = scalar.val[2];
G = a;
B = b;
break;
default:
break;
}
}
RGB = cvScalar(R, G, B);
return RGB;
}
CvScalar transfor_bgr( CvScalar normal_rgb)
{
CvScalar cv_bgr;
int blue = int(normal_rgb.val[2] * 255+0.5);
int B = (blue > 255) ? 255 : blue;
B = (blue < 0) ? 0 : blue;
int green = int(normal_rgb.val[1] * 255+0.5);
int G = (green > 255) ? 255 : green;
G = (green < 0) ? 0 : green;
int red = int(normal_rgb.val[0] * 255+0.5);
int R = (red > 255) ? 255 : red;
R = (red < 0) ? 0 : red;
cv_bgr.val[0] = B;
cv_bgr.val[1] = G;
cv_bgr.val[2] = R;
return cv_bgr;
}
CvScalar transfor_HSV(CvScalar cv_hsv )
{
CvScalar normal_hsv;
normal_hsv.val[0] = cv_hsv.val[0] * 2;
normal_hsv.val[1] = (double)(cv_hsv.val[1] )/ 255;
normal_hsv.val[2] = (double)(cv_hsv.val[2]) / 255;
return normal_hsv;
}
int main()
{
IplImage* img_bgr = cvLoadImage("C:\\Users\\jiangpei-pc\\Desktop\\new\\lena.jpg");
IplImage* img_hsv = cvCreateImage(cvGetSize(img_bgr), 8, 3);
cvCvtColor(img_bgr, img_hsv, CV_BGR2HSV);
int width = img_bgr->width;
int height = img_bgr->height;
for (int i = 0; i < 350;i++)
{
CvScalar scalar_hsv = cvGet2D(img_hsv, 0, i);
CvScalar scalar_rgb = cvGet2D(img_bgr, 0, i);
CvScalar temp_hsv = cvScalar(0, 0, 0);
CvScalar compute_rgb = cvScalar(0, 0, 0);
CvScalar temp_rgb ;
temp_hsv=transfor_HSV(scalar_hsv );
temp_rgb = fun_hsv2rgb(temp_hsv);
compute_rgb=transfor_bgr(temp_rgb);
//cout << i << " row the H value is: " << scalar_hsv.val[0] << endl;
cout << i << " row the B value is: " << scalar_rgb.val[0] << endl;
cout << i << " row the compute B value is: " << compute_rgb.val[0] << endl;
}
cvNamedWindow("image", 1);
cvShowImage("image", img_hsv);
if (cvWaitKey()==27)
{
return 1;
}
}
相关文章推荐
- opencv学习笔记---hsv颜色空间
- OpenCV HSV颜色空间基本颜色范围
- OpenCV Using Python——HSV颜色空间和改进的YCbCr颜色空间中的肤色检测
- OpenCV 利用hsv颜色空间的车牌底色检测
- opencv hsv颜色空间区分出来某一特定颜色的简单程序
- OpenCV之RGB与HSV颜色空间的转换
- ios--OpenCV--RGB与HSV颜色空间的转换
- Opencv映射到HSV颜色空间
- OpenCV-利用函数inRange进行颜色分割(针对HSV颜色空间)
- 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图
- 【opencv】在hsv颜色空间识别区域颜色
- OpenCV颜色空间——HSV颜色空间
- opencv学习笔记---hsv颜色空间
- OpenCV WinCE/WM移植
- opencv-线性滤波器filer2D
- opencv数据结构总结
- OpenCV 简介
- Python-OpenCV 图像与视频处理
- opencv的使用例子
- opencv学习之visual studio2015+opencv2.4.13配置