基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V

            刚刚把去年写过的几篇博文下架了,感觉没下什么功夫在上面,不太值得小伙伴们费神,干脆全部删掉,重新开始嘛酷

        这学期我们大智能开始第一波专业课,基于Opencv下的计算机视觉处理,感觉比较有趣,希望通过不断的学习能够在日后做出自己喜欢的作品。

        这次博文属于我的第一个课程实验,初次接触,印象最为深刻。

       

1)初次接触

这是脑与科学的第一个实验,看到实验内容时感觉无从下手,因为自己只是刚刚把Opencv库函数装载好,只会一个当初搭建环境时助教给的小程序里面的cvShowImage显示图像函数,感觉要坑;

2)尝试解决

起初,感觉自己学了一年多编程了,自我感觉良好,觉得看看相关教程就可以轻松解决,于是乎,拿起

 

一顿看,结果看的自己一头雾水,自信心受挫;

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,dst2dst3

 

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模型。

 

三维坐标:

 

基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V_第1张图片

 

原点到白色顶点的中轴线是灰度线,rgb三分量相等,强度可以由三分量的向量表示。

 

RGB来理解色彩、深浅、明暗变化:

 

色彩变化: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线

 

深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离

明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮

PS: 光学的分析

 

三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。

 

只能说将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。

 

2. HSV模型

 

倒锥形模型:

 

基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V_第2张图片

 

HSV模型的圆锥表示适合于在一个单一物体中展示整个HSV色彩空间。

 

这个模型就是按色彩、深浅、明暗来描述的。

 

H是色彩

 

S是深浅, S = 0时,只有灰度

 

V是明暗,表示色彩的明亮程度,但与光强无直接联系(意思是有一点点联系吧)。

 

RGBHSV的联系

 

转换表达式:

 


     基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V_第3张图片
    
    
    效果图

 

 

 还不错~~

 

 实现了单通道的分离;

 

     不过我最得意的还是自己找的对象图片...

     基于Opencv下RGB图像转HSV,并分离成单通道R/G/B与H/S/V_第4张图片

    代码附上

 

 

#include "stdafx.h"
#include"highgui.h"
#include"cv.h"
#include
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;
}


 

 

你可能感兴趣的:(Opencv)