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

来源:互联网 发布:商品数据分析管理服装 编辑:程序博客网 时间:2024/05/05 19:29
#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;}

0 0
原创粉丝点击