基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V 博客分类: Opencv opencv图像分离RGBHSV
刚刚把去年写过的几篇博文下架了,感觉没下什么功夫在上面,不太值得小伙伴们费神,干脆全部删掉,重新开始嘛
这学期我们大智能开始第一波专业课,基于Opencv下的计算机视觉处理,感觉比较有趣,希望通过不断的学习能够在日后做出自己喜欢的作品。
这次博文属于我的第一个课程实验,初次接触,印象最为深刻。
1)初次接触
这是脑与科学的第一个实验,看到实验内容时感觉无从下手,因为自己只是刚刚把Opencv库函数装载好,只会一个当初搭建环境时助教给的小程序里面的cvShowImage显示图像函数,感觉要坑;
2)尝试解决
起初,感觉自己学了一年多编程了,自我感觉良好,觉得看看相关教程就可以轻松解决,于是乎,拿起
<!--EndFragment-->一顿看,结果看的自己一头雾水,自信心受挫;
3)求助度娘
没办法,怀着忐忑不安的心情,点进了百度,一下子找到了很多相关的文章,从中copy了一份分离R/G/B单通道的,启动调试,竟然成功了;
4)然后呢
相信除了少数技术大神,许多人都会想我一样寻求度娘的帮助,但是,接下来的问题,不同人会有不同的后续。。。。。。
next>>
许多小朋友往往找到自己所需的答案后,就不再继续深入研究,这样做很不好,不能知其然而不知其所以然。
首先,我把程序里面出现的函数,全部转到函数声明,然后寻找其头文件,查看它们的源代码,下面先罗列一下本次直言所遇到的函数(简单的忽略):
cvLoadImage("F:\\Fruits.jpg",1);//载入图像,注意此处1为正数//表示作为三通道图像载入
cvCreateImage(size,depth,channels) //函数,depth 图像元素的位深//度,IPL_DEPTH_8U 表示无符号8位整型
cvSplit( const CvArr* src,CvArr* dst0,CvArr* dst1,CvArr* dst2,CvArr* dst3 )
//复制多通道src图像的各个通道到单通道图像//dst0,dst1,dst2和dst3中
cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3,CvArr* dst )
//与cvSplit相反,将3个单通道合成为一个多通道图像
cvReleaseImage( IplImage** image )
//销毁已定义的image指针变量,释放占用内存空间
cvCvtColor(img,hsv,CV_BGR2HSV)
//实现RGB颜色向HSV,HSI等颜色空间的转换
看完这些函数,虽然已解释的很详细,但毕竟是被封装过的,许多内部原理不可能完全理解,下面,我们再来仔细研究RBG——HSV。
模型问题
1. RGB模型。
三维坐标:
原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。
用RGB来理解色彩、深浅、明暗变化:
色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离
明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮
PS: 光学的分析
三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。
只能说“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。
2. HSV模型
倒锥形模型:
HSV模型的圆锥表示适合于在一个单一物体中展示整个HSV色彩空间。
这个模型就是按色彩、深浅、明暗来描述的。
H是色彩
S是深浅, S = 0时,只有灰度
V是明暗,表示色彩的明亮程度,但与光强无直接联系(意思是有一点点联系吧)。
RGB与HSV的联系
转换表达式:
效果图
还不错~~
实现了单通道的分离;
不过我最得意的还是自己找的对象图片...
代码附上
#include "stdafx.h" #include"highgui.h" #include"cv.h" #include<vector> using namespace std; using namespace cv; int main() { //载入图像 IplImage* img=cvLoadImage("F:\\Fruits.jpg",1); //cvCreateImage(size,depth,channels)函数,depth 图像元素的位深度,IPL_DEPTH_8U 表示无符号8位整型 IplImage* Bimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);//1为有1个通道 IplImage* Gimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); IplImage* Rimg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); IplImage* pImg1=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);//3为有3个通道 IplImage* pImg2=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); IplImage* pImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); //将RGB图像分离 //cvSplit( const CvArr* src,CvArr* dst0,CvArr* dst1,CvArr* dst2,CvArr* dst3 )函数 //复制src的各个通道到图像dst0,dst1,dst2和dst3中 cvSplit(img,Bimg,Gimg,Rimg,0); //目标图像必须与源图像在大小和数据类型上匹配 //输入多通道,输出为B,G,R单通道 //在合成之前需要清零 cvSetZero(pImg1); cvSetZero(pImg2); cvSetZero(pImg3); //将三个通道合成 //输入参数为B,G,R单通道,最后一个为输出 //cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3,CvArr* dst ); cvMerge(Bimg,0,0,0,pImg3); cvMerge(0,Gimg,0,0,pImg2); cvMerge(0,0,Rimg,0,pImg1); cvNamedWindow("RGB",1); cvShowImage("RGB",img); cvNamedWindow("R",1); cvShowImage("R",pImg1); cvNamedWindow("G",1); cvShowImage("G",pImg2); cvNamedWindow("B",1); cvShowImage("B",pImg3); //HSV图像处理 IplImage* hsv=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); //将RGB图像转为HSV图像的函数 cvCvtColor(img,hsv,CV_BGR2HSV); IplImage* Himg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1); IplImage* Simg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1); IplImage* Vimg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1); IplImage* HSV1=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3);//3个通道 IplImage* HSV2=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3); IplImage* HSV3=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,3); //用法同上 cvSplit(hsv,Vimg,Simg,Himg,0); cvNamedWindow("V",1); cvShowImage("V",Vimg); cvNamedWindow("S",1); cvShowImage("S",Simg); cvNamedWindow("H",1); cvShowImage("H",Himg); cvNamedWindow("HSV",1); cvShowImage("HSV",hsv); cvWaitKey(0); //RGB RELEASE cvReleaseImage(&img); cvReleaseImage(&Rimg); cvReleaseImage(&Gimg); cvReleaseImage(&Bimg); cvReleaseImage(&pImg1); cvReleaseImage(&pImg2); cvReleaseImage(&pImg3); //HSV RELEASE cvReleaseImage(&hsv); cvReleaseImage(&Himg); cvReleaseImage(&Simg); cvReleaseImage(&Vimg); cvReleaseImage(&HSV1); cvReleaseImage(&HSV2); cvReleaseImage(&HSV3); return 0; }
<!--EndFragment-->
<!--EndFragment-->
<!--EndFragment-->