`
java-大神
  • 浏览: 35002 次
  • 性别: Icon_minigender_1
  • 来自: 大山东
社区版块
存档分类
最新评论

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

阅读更多

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

        这学期我们大智能开始第一波专业课,基于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,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模型。

 

三维坐标:

 

 

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

 

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

 

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

 

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

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

PS: 光学的分析

 

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

 

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

 

2. HSV模型

 

倒锥形模型:

 



 

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

 

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

 

H是色彩

 

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

 

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

 

RGBHSV的联系

 

转换表达式:

 


    
    
    
    效果图

 

 

 还不错~~

 

 实现了单通道的分离;

 

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

    

    代码附上

 

 

#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-->

 

  • 大小: 25.5 KB
  • 大小: 48.9 KB
  • 大小: 3 KB
  • 大小: 1.5 KB
  • 大小: 403 Bytes
  • 大小: 574.4 KB
  • 大小: 121.3 KB
分享到:
评论

相关推荐

    opencv RGB转换成HSV并且从R G B H S V三个单通道输出

    该代码用opencv和vs2010联合编程实现了讲RGB图像转换成HSV图像,并且实现了R G B H S V单通道输出

    基于opencv的彩色图像分解为hsv单通道并显示灰度直方图以及数值

    本项目聚焦于使用OpenCV在VC6.0集成开发环境中处理RGB彩色图像,将其转换为HSV色彩空间,并进一步分解为单个通道,同时显示每个通道的灰度直方图及对应的像素值。以下是对这一过程的详细解释: 1. **RGB到HSV转换**...

    RGB图像转HSV

    RGB图像和HSV图像都是彩色图像表示的两种常见方式。RGB(Red, Green, Blue)是基于加色原理的颜色模型,通常用于显示器、电视等显示设备,它通过红、绿、蓝三种基本颜色的不同组合,可以形成多种颜色。而HSV(Hue, ...

    OpenCvSharp图像灰度直方图(BGR、HSV、Lab多通道及单通道的灰度直方图)

    要计算BGR图像的灰度直方图,我们首先需要将BGR图像转换为单通道灰度图像,这通常通过加权平均实现,如公式Y = 0.21R + 0.72G + 0.07B。然后,我们可以使用OpenCvSharp的`CalcHist`函数来计算直方图,并使用`...

    基于OpenCV图像处理的智能小车户外寻迹算法的设计.docx

    本文重点讨论了基于OpenCV图像处理的智能小车户外寻迹算法的设计,并详细阐述了HSV通道分离和OpenCV图像处理函数在其中的应用。 #### 二、HSV通道分离处理 ##### 1.1 HSV空间的概念 HSV(Hue,Saturation,Value...

    rgb转换hsv及分量提取

    该函数将 HSV 图像分离为三个单通道图像,每个单通道图像对应一个分量。 在图像处理和分析中,分量提取是一个非常重要的步骤。通过分量提取,我们可以获取图像的颜色特征、饱和度特征和亮度特征,从而更好地分析和...

    opencv 颜色通道的分离及混合

    本主题将深入探讨如何使用OpenCV实现彩色图像的颜色通道的分离与混合,这对于理解和操作图像的RGB或HSV等颜色空间至关重要。 首先,我们要了解颜色通道的概念。在RGB颜色模型中,每个像素由红色(R)、绿色(G)和...

    图像中将彩色图像分别转化为三个RGB通道

    在图像处理领域,彩色图像通常由红(R)、绿(G)和蓝(B)三种颜色通道组合而成,我们称之为RGB色彩模式。这种模式是基于人眼对这三种颜色敏感度的不同来模拟人眼看到的颜色。当我们谈论将彩色图像转化为三个RGB...

    OpenCV RGB不同彩色空间的转换公式及实现

    然而,在不同的应用场景下,如图像分析、图像增强或机器学习任务中,我们可能需要将RGB图像转换为其他彩色空间,如HSV、YCrCb、Lab等,以获得更好的处理效果。 1. **HSV(色相、饱和度、价值)彩色空间**:HSV是另...

    分离多通道图像RGB的值

    在图像处理领域,分离多通道图像的RGB值是一项基本操作,尤其在使用OpenCV和MATLAB这样的工具时。RGB(Red, Green, Blue)是一种颜色模型,它将颜色表示为红、绿、蓝三种基本色的组合。在计算机视觉和图像分析中,...

    opencv-基于c++实现的opencv图像处理算法之颜色空间变换RGB2GRAY.zip

    `Gray = 0.299 * R + 0.587 * G + 0.114 * B` 这个公式是基于人眼对不同颜色敏感度的统计平均结果。 在程序运行后,`cv::imshow()`函数会打开两个窗口分别显示原始RGB图像和转换后的灰度图像。`cv::waitKey()`函数...

    opencv图像处理-opencv图像处理算法之色彩转换.zip

    4. 彩色图像到灰度图像的转换:在进行一些需要单通道图像的处理任务时,如边缘检测或模板匹配,通常会先将图像转换为灰度。 5. 光照不敏感的处理:HSV空间中的H分量对光照变化不敏感,因此在光照变化的环境中,可以...

    OpenCV--颜色通道分离与混合

    OpenCV提供了一个名为`split()`的函数,用于分离图像的颜色通道。例如,如果我们有一个BGR图像,我们可以使用以下代码将其分解为三个独立的单通道图像: ```python import cv2 # 读取BGR图像 img_bgr = cv2.imread...

    基于OPENCV的灰度图像伪彩色处理

    在图像处理领域,伪彩色(Pseudo-color)是一种将单通道图像,如灰度图像,转化为多通道图像,通常为RGB三通道图像的技术。这种转化并非真正的颜色转换,而是通过算法将灰度值映射到特定的颜色空间,使得观察者能更...

    HSV_图像融合_

    这是通过应用数学变换完成的,每个像素的R、G、B值会被转换为对应的H、S、V值。 3. **图像融合**:在HSV空间中,可以对色相、饱和度和亮度三个通道分别进行不同的融合策略。例如,可能保留一个图像的色相信息,而...

    用OpenCV提取RGB三个通道.zip_Opencv取R通道_leave9yb_musicy98_opencv_wisevab

    本主题聚焦于如何使用OpenCV从BGR图像中提取RGB三个通道,并分别显示它们。我们将深入理解颜色空间,BGR与RGB的概念,以及如何在C++中使用OpenCV实现这一过程。 首先,我们要了解颜色空间。BGR(Blue-Green-Red)是...

    HVS提取H通道

    提取H通道后,我们通常会得到一个与原图尺寸相同的单通道图像,其中每个像素值代表了对应位置的色调。在OpenCV中,可以使用通道分离功能(`cv::split`)来获取单独的H通道: ```cpp cv::Mat h_channel; // 提取H、S...

    OpenCV图像转换源码

    `Mat`可以表示单通道(如灰度图像)、双通道(如颜色空间中的RGB图像)或多通道(如颜色空间中的BGR图像)图像。每个`Mat`对象都有行数、列数和通道数等属性。 四、图像转换 1. **颜色空间转换**:OpenCV提供了一...

    【OpenCV入门教程之五】 分离颜色通道&多通道图像混合 - 【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 - CSDN博客

    在RGB图像中,每个像素通常由红(R)、绿(G)和蓝(B)三个通道组成。`split`函数能够将一个多通道数组(例如,一个RGB图像)分解为三个独立的单通道数组,分别对应于图像的红色、绿色和蓝色通道。在C++中,`split`函数有...

    opencv实现图像颜色增强算法

    在C++中,`cv::Mat`可以表示单通道(如灰度图像)、双通道(如红绿蓝RGB图像)或三通道(如BGR图像)的图像。 颜色增强通常涉及以下几个方面: 1. **直方图均衡化**:这是一种常见的方法,通过改变图像像素的分布...

Global site tag (gtag.js) - Google Analytics