您的位置:首页 > 其它

将BGR图像转换成HSV颜色空间的转换

2016-06-19 22:15 316 查看
#include "highgui.h"
#include "cv.h"
#include "cxcore.h"

int main(int argc, char* argv[])
{
IplImage* src = cvLoadImage("F:\\2.jpg");

// RGB颜色空间的介绍:
// 三基色原理:大多数的颜色可以通过红绿蓝三色按照不同的比例合成产生,同样大多数单色光也可以分解成红绿蓝三种色光
// 红绿蓝三基色按照不同的比例相加合成混色称为相加混色。其中一些混色的规律有:红绿=黄、绿蓝=青、红蓝=品红、
// 红绿蓝=白、红青=白、绿品红=白、蓝黄=白。
// 互补光:当两种光按照适当的比例混合得到白光时,称这两种光为互补光。所以,按照混色的规律我们可以得到青、黄、品红
// 分别为红、蓝、绿的补色。亮度的定义:单色光的亮度强度各不相同,根据人的感受是:绿色最亮,红光次之,蓝光最弱。
// 假设得到白光的强度为100%。如果用Y表示景物的亮度,则通常有:Y=0.299R+0.587G+0.114B因为红绿蓝三基色能够合成
// 自然界所有的色彩,因此在电子设备和软件中,经常使用红绿蓝三基色合成五颜六色的图像。用以上的相加混色表示的颜色模式
// 成为RGB模式。

/*
IplImage* img_hsv = cvCreateImage(cvGetSize(src), 8, 3);
IplImage* img_h = cvCreateImage(cvGetSize(src), 8, 1);
IplImage* img_s = cvCreateImage(cvGetSize(src), 8, 1);
IplImage* img_v = cvCreateImage(cvGetSize(src), 8, 1);
*/

IplImage* src_float = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 3);
cvConvertScale(src, src_float, 1.0, 0);// 将src的数据类型转换成float型的src_float,第三个参数是转换的因数乘的倍数,第四个参数是旋转的角度。

IplImage* img_hsv = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 3);
IplImage* img_h = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
IplImage* img_s = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);
IplImage* img_v = cvCreateImage(cvGetSize(src), IPL_DEPTH_32F, 1);

cvCvtColor(src_float, img_hsv, CV_BGR2HSV); // 颜色空间的转换,将src转换成img_hsv,
// 第三个参数就是将BGR颜色空间转换成HSV颜色空间,其中的第三个参数里的2表示to的意思到。
cvSplit(img_hsv, img_h, img_s, img_v, NULL);
// hsv 颜色空间s表示饱和度取值范围是0到1,v表示亮度取值范围是0到1,h的取值范围在0到360之间,h代表的是各种颜色取不同的值代表不同的颜色。

IplImage* hsv = cvCreateImage(cvGetSize(src), 8, 3);
IplImage* h = cvCreateImage(cvGetSize(src), 8, 1);
IplImage* s = cvCreateImage(cvGetSize(src), 8, 1);
IplImage* v = cvCreateImage(cvGetSize(src), 8, 1);

cvConvertScale(img_h, h, (1.0 / 360.0) * 255.0, 0); // 下面表示的是将hsv分开的三张图像转换成一张图像,
cvConvertScale(img_s, s, 255.0, 0);
cvConvertScale(img_v, v, 1.0, 0);

cvMerge(h, s, v, NULL, hsv); // 这个是将单通道的图像合成三通道的图像,将h,s,v合成hsv图像,
cvNamedWindow("hsv");
cvShowImage("hsv", hsv); // cvShowImage 无论图像是什么图像就将图像认为是RGB图像进行显示出来。

for (int y = 0; y < img_s->height; y++)  // 这个for循环就是将h通道里的值输出来看一下。
{
for (int x = 0; x < img_s->width; x++)
{
float value = cvGetReal2D(img_s, y, x);
//if (value>=360)
//printf("%f ", value);
}
printf("\n");
}

cvNamedWindow("img_h");
cvShowImage("img_h", img_h);
cvWaitKey(0);

cvReleaseImage(&img_h);
cvReleaseImage(&hsv);
cvDestroyWindow("img_h");
cvDestroyWindow("hsv");

return 0;

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