将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; }
相关文章推荐
- Linux的inode的理解
- mysql常用基础操作语法(六)--对数据排序和限制结果数量的条件查询【命令行模式】
- [转]pycharm的一些快捷键
- 20145330《Java程序设计》课程总结
- 8-2-伙伴系统-动态存储管理-第8章-《数据结构》课本源码-严蔚敏吴伟民版
- 扩展KMP
- shell下的基础程序题练习
- 排列(permutation)的末尾 0 的个数
- Android 自定义新闻加载页面
- 线程汇总(3)
- Hibernate组件属性
- Altium Designer 有用快捷设置
- Github 的 Markdown 语法入门指南
- SOAP和WSDL的一些必要知识
- 最大子数组 三种不同复杂度的算法
- UML类图几种关系的总结
- ps一些快捷键
- @Basic(fetch=FetchType.EAGER)和@Basic(fetch=FetchType.LAZY)
- 20145312《Java程序设计》课程总结
- FastReport中的frxRichView如何设置二种不同的字体 [问题点数:100分,结帖人LIULIVERYOK]