您的位置:首页 > 运维架构

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;
}
}

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