OpenCV中RGB和HSV转换的问题

1、一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255。但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0到255。代码如下:

IplImage* src = cvLoadImage("1.jpg",1);   

IplImage* imghsv = cvCreateImage(cvGetSize(src),8,3);

cvCvtColor(src ,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

2、上述图片保存的过程中,图像以8位3通道的形式保存,每个颜色分量占用8位,值的范围为0到255,所以OpenCV将H值的范围缩小了一半,变为0到180°。可以调用cvConverScale将图像从8位转换为32位float型。这样HSV的范围就是:H为0到360°,S为0到100%,V为0到255。测试代码如下:

Mat mat1 = cv::imread("1.png");
CvScalar s1;
CvScalar s2;
CvScalar s3;
IplImage image1 = mat1;
int width = mat1.rows;
int height = mat1.cols;

Mat mat2 = mat1.clone();
IplImage image2 = mat2;

cvCvtColor(&image1,&image2,CV_BGR2HSV); 

IplImage* image3 = cvCreateImage(cvGetSize(&image1),IPL_DEPTH_32F,3);
cvConvertScale(&image1,image3,1.0,0);	//将src图像从8位转换成32位float型变量

IplImage* imghsv = cvCreateImage(mat1.size(),IPL_DEPTH_32F,3);
cvCvtColor(image3,imghsv,CV_BGR2HSV);//BGR转换成HSV模型

for(int i=0; i<width; i++)
{
	for(int j=0; j<height; j++)
	{
		s1 = cvGet2D(&image1, i, j);
		s2 = cvGet2D(&image2, i, j);
	        s3 = cvGet2D(imghsv, i, j);
	}
}

3、当进行HSV各分量显示的时候,可以通过cvSplit函数将各通道分离,然后通过cvConvertScale函数将各分量的范围都转化成0到255,在通过8位无符号型图像显示即可。因为cvShowImage函数只能显示8位无符号型图像,不能显示32位Float型图像。

4、当进行HSV模型还原到RGB模型时,这里使用cvCvtColor函数就要注意,输入的HSV模型的图像必须将HSV各分量还原到默认的范围。这样cvCvtColor转换后的RGB图像才是正确的。

参考:

http://blog.csdn.net/harryching/article/details/20486003

转载于:https://www.cnblogs.com/justkong/p/6588704.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值