OpenCV中将BGR图像转为HSV,并显示
2013-04-14 20:08
197 查看
最近要处理视频中检测到的阴影,看了一些文章,提到可以利用HSV 三个通道中的一个或者两个组合来进行检测与分割,故小试了一下分离HSV通道,如下为代码,整了一个小时,才显示正确。
HSV颜色空间是描述比RGB更准确的颜色感知颜色联系,并在计算上更简单。从RGB颜色空间转换到HSV颜色空间在OpenCV中是如下实现的:
其中的RGB图像不管是8位的,还是16位的,首先需要将其统统转换成浮点型的,即其值在0~1之间。因此转换后的V和S也属于0~1,H属于0~360度。
[html] view
plaincopy
#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cvaux.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src = NULL;
IplImage* floatsrc = NULL;
IplImage* floathsv = NULL;
IplImage* floatimgH = NULL;
IplImage* floatimgS = NULL;
IplImage* floatimgV = NULL;
cvNamedWindow( "src", 1 );
cvNamedWindow( "HSV", 1 );
cvNamedWindow( "H通道", 1 );
cvNamedWindow( "S通道", 1 );
cvNamedWindow( "V通道", 1 );
src = cvLoadImage( "D:\\lena.jpg", -1);
CvSize size = cvGetSize( src );
//先将图像转换成float型的
floatsrc = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floathsv = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floatimgH = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgS = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgV = cvCreateImage( size, IPL_DEPTH_32F, 1 );
//将src从8位转换到32位的float型
cvConvertScale( src, floatsrc, 1.0/255.0, 0 );
//将float型图像 从BGR转换到HSV 如果需要转换到其他的颜色空间 那么改变CV_BGR2HSV即可
//cvCvtColor要求两个参数的类型必须完全相同,所以要转为float型
cvCvtColor( floatsrc, floathsv, CV_BGR2HSV);
//将三通道图像 分解成3个单通道图像,H对应的通道时0,S、V对应的通道时1和2
//cvCvtPixToPlane(picHSV, h_plane, s_plane, v_plane, 0);
cvSplit( floathsv, floatimgH, floatimgS, floatimgV, 0);
cvShowImage( "src", src );
cvShowImage( "HSV", floathsv );
cvShowImage( "H通道", floatimgH );
cvShowImage( "S通道", floatimgS );
cvShowImage( "V通道", floatimgV );
cvWaitKey( 0 );
cvReleaseImage( &src );
cvReleaseImage( &floathsv );
cvReleaseImage( &floatimgH );
cvReleaseImage( &floatimgS );
cvReleaseImage( &floatimgV );
return 0;
}
HSV颜色空间是描述比RGB更准确的颜色感知颜色联系,并在计算上更简单。从RGB颜色空间转换到HSV颜色空间在OpenCV中是如下实现的:
其中的RGB图像不管是8位的,还是16位的,首先需要将其统统转换成浮点型的,即其值在0~1之间。因此转换后的V和S也属于0~1,H属于0~360度。
[html] view
plaincopy
#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "cvaux.h"
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* src = NULL;
IplImage* floatsrc = NULL;
IplImage* floathsv = NULL;
IplImage* floatimgH = NULL;
IplImage* floatimgS = NULL;
IplImage* floatimgV = NULL;
cvNamedWindow( "src", 1 );
cvNamedWindow( "HSV", 1 );
cvNamedWindow( "H通道", 1 );
cvNamedWindow( "S通道", 1 );
cvNamedWindow( "V通道", 1 );
src = cvLoadImage( "D:\\lena.jpg", -1);
CvSize size = cvGetSize( src );
//先将图像转换成float型的
floatsrc = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floathsv = cvCreateImage( size, IPL_DEPTH_32F, 3 );
floatimgH = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgS = cvCreateImage( size, IPL_DEPTH_32F, 1 );
floatimgV = cvCreateImage( size, IPL_DEPTH_32F, 1 );
//将src从8位转换到32位的float型
cvConvertScale( src, floatsrc, 1.0/255.0, 0 );
//将float型图像 从BGR转换到HSV 如果需要转换到其他的颜色空间 那么改变CV_BGR2HSV即可
//cvCvtColor要求两个参数的类型必须完全相同,所以要转为float型
cvCvtColor( floatsrc, floathsv, CV_BGR2HSV);
//将三通道图像 分解成3个单通道图像,H对应的通道时0,S、V对应的通道时1和2
//cvCvtPixToPlane(picHSV, h_plane, s_plane, v_plane, 0);
cvSplit( floathsv, floatimgH, floatimgS, floatimgV, 0);
cvShowImage( "src", src );
cvShowImage( "HSV", floathsv );
cvShowImage( "H通道", floatimgH );
cvShowImage( "S通道", floatimgS );
cvShowImage( "V通道", floatimgV );
cvWaitKey( 0 );
cvReleaseImage( &src );
cvReleaseImage( &floathsv );
cvReleaseImage( &floatimgH );
cvReleaseImage( &floatimgS );
cvReleaseImage( &floatimgV );
return 0;
}
相关文章推荐
- OpenCV中将BGR图像转为HSV,并显示
- OpenCV中读取RGB格式图像转成HSV格式图像显示
- opencv 将BGR转为HSV
- OpenCV中读取RGB格式图像转成HSV格式图像显示
- OpenCV中读取RGB格式图像转成HSV格式图像显示
- python opencv 中将图像由BGR转换为CHW用于后期的深度训练
- OpenCV中读取RGB格式图像转成HSV格式图像显示
- 图像显示与加载——opencv(转)
- Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)
- Opencv学习_2 (opencv结构&显示图像)
- Qt对话框显示opencv读取的图像
- 用OpenCV-Python 完成简单的图像读取,显示
- OpenCV2.4.6 与VS2008,Python2.7.5配置和图像载入显示
- OpenCV入门:初试牛刀 — 显示图像
- 在MFC中使用OpenCV,控件显示图像
- 关于opencv中imshow()函数在VS中调用不显示图像的问题
- Qt中用QLabel显示OpenCV中Mat图像数据出现扭曲现象的解决
- opencv2/3播放视频实现进度条显示拖动、快进、快退、逐帧播放、显示当前帧于图像
- 利用opencv进行图像文件读入和显示
- 图像显示与加载——opencv