多通道(Multichannel)单通道(singlechannel)图像概念梳理
在做机器视觉时,常常要将一个多通道图像分离成几个单通道图像或者将几个单通道图像合成一个多通道图像,以方便图像处理,但是。写这篇博客,是为加深对这两个概念的理解,下面会给出部分OpenCV对单通道与多通道图像间相互转化的程序代码,并对运行结果进行观察分析。
OpenCV中常用IplImage或CvMat存储图像矩阵,而对这两个对象的初始化函数cvCreateImage(CvSize size, int depth, int channels )和cvCreateMat( int rows, int cols, int type );的最后一个参数channels(通道数可以是1、2、3、4)和type都包含了选择通道数,一般来说常用的是RGB颜色空间,而R、G、B则表示三个通道,是三通道图像。此外,depth代表深度,type里包含对深度的选择,深度即选择存储图像矩阵的元素数据类型(长度),当然是数据长度(比如8bit,16bit,32bit)越长,能存储的范围越大,相应的,像素也越大,图像就越清晰。
图像通道在RGB色彩模式下就是指在下就是指那单独的红色R、绿色G、蓝色B部分。也就是说,一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像。同样在HSV色系中指的是色调H,饱和度S,亮度V三个通道。除了这两个三通道图像模式,以下列举了还列举一些图像模式(来自百度百科图像模式)
图像模式:
Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerRG2BGR, CV_BayerGB2RGB, CV_BayerGR2BGR, CV_BayerRG2RGB, CV_BayerBG2BGR, CV_BayerGR2RGB, CV_BayerGB2BGR)
/* Constants for color conversion */
#define CV_BGR2BGRA 0
#define CV_RGB2RGBA CV_BGR2BGRA
#define CV_BGRA2BGR 1
//...大部分省略
#define CV_Luv2RGB 59
#define CV_HLS2BGR 60
#define CV_HLS2RGB 61
#define CV_COLORCVT_MAX 100
cvSplit( const CvArr* src, CvArr* dst0,
CvArr* dst1,Arr* dst2, CvArr* dst3 );函数对某个颜色空间的多个通道进行分离。用cvMerge(
const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3, CvArr* dst );函数将几个单通道图像合并为一个多通道图像。
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
using namespace std;
int main(int argc,char **argv)
{
if(argc>=2)
{
IplImage *image,*change,*H,*S,*V,*R,*B,*G,*two,*Zero;
//创建图像显示窗口
cvNamedWindow("image",CV_WINDOW_AUTOSIZE);
cvNamedWindow("R",CV_WINDOW_AUTOSIZE);
cvNamedWindow("G",CV_WINDOW_AUTOSIZE);
cvNamedWindow("B",CV_WINDOW_AUTOSIZE);
cvNamedWindow("HS",CV_WINDOW_AUTOSIZE);
cvNamedWindow("HV",CV_WINDOW_AUTOSIZE);
cvNamedWindow("VS",CV_WINDOW_AUTOSIZE);
cvNamedWindow("RG",CV_WINDOW_AUTOSIZE);
cvNamedWindow("RB",CV_WINDOW_AUTOSIZE);
cvNamedWindow("BG",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Zero",CV_WINDOW_AUTOSIZE); image=cvLoadImage(argv[1]);//载入图像 //分配图像空间
change=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3);
R=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
G=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
B=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
H=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
S=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
V=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
two=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3);
Zero=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1); cvZero(Zero);//在将两个通道合并是,不能没有第三个通道,而是将该通道设为空白,即全0 cout<<"IPL_DEPTH_8U = "<<IPL_DEPTH_8U<<endl;
cout<<"CV_RGB2HSV = "<<CV_RGB2HSV<<endl;
cout<<"CV_HSV2RGB = "<<CV_HSV2RGB<<endl; cvCvtColor(image,change,CV_RGB2HSV); //将RGB色系转换为HSV色系 cvSplit(image,R,G,B,0);//分离多通道
cvSplit(change,H,S,V,0);//分离多通道 //显示RGB图单通道图
cvShowImage("image",image);
cvShowImage("Zero",Zero);
cvShowImage("R",R);
cvShowImage("G",G);
cvShowImage("B",B); cvMerge(R,G,Zero,0,two); //合并两个图像空间
cvShowImage("RG",two);//显示B通道为空白时的图像 cvMerge(Zero,G,B,0,two);
cvShowImage("BG",two); cvMerge(R,Zero,B,0,two);
cvShowImage("RB",two); cvMerge(H,S,Zero,0,two);
cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
cvShowImage("HS",change); cvMerge(Zero,S,V,0,two);
cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
cvShowImage("VS",change); cvMerge(H,Zero,V,0,two);
cvCvtColor(two,change,CV_HSV2RGB);//cvShowImage是按照RGB色彩方式显示图像的,故要通过RGB色系展示对HSV色系的更改效果
cvShowImage("HV",change); cvWaitKey(0); cvDestroyAllWindows();
cvReleaseImage(&image);
cvReleaseImage(&change);
}
system("pause");
return 1;
}
(注意:cvShowImage展示图像是通过RGB的方式展示的,所以要展示HSV色系的图像,要先将其变化为RGB色系再进行展示。一个三通道的图像,如RGB空间的图像,"缺少"某个通道,不能是某个通道的没有为NULL,而是该通道的元素值都为0,这里增加了Zero单通道图像空间,并用cvZero清空。)
多通道(Multichannel)单通道(singlechannel)图像概念梳理的更多相关文章
- tensorflow tensor Flatten 张量扁平化,多通道转单通道数据
slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim) ...
- opencv C++构造并访问单通道和多通道Mat。
一:构造并访问单通道. int main(){ cv::Mat m=(cv::Mat_<int>(3,2)<<1,2,3,4,5,6); for(int i=0;i<m. ...
- C++ opencv 滑动条 Trackbary以及处理三通道和单通道图像
#include <opencv2\core.hpp> #include <opencv2\highgui.hpp> #include <opencv2\imgproc. ...
- stm32之ADC应用实例(单通道、多通道、基于DMA)
文本仅做记录.. 硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗). 所用的芯片内嵌 ...
- stm32之ADC应用实例(单通道、多通道、基于DMA)-转载精华帖,最后一部分的代码是精华
硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗).所用的芯片内嵌3个12位的 ...
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...
- 使用opencv为没有透明通道的图像加入透明通道
在图像处理中,我们经常需要处理带透明通道的图片,比如为图片或视频添加水印,为图片或视频添加字幕.贴图等.然而,我们的素材图片未必总是带有透明通道.比如,素材的背景本该透明的地方,却是黑色和白色.有时, ...
- [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event
[DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event 事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...
- RH6030 单通道触摸感应开关
1.概述: RH6030 是一款单通道电容式触摸感应控制开关IC,可以替代传统的机械式开关. 该 IC 采用CMOS 工艺制造,结构简单,性能稳定.IC 可通过外部引脚配置成多种工作模式,可广泛应用于 ...
随机推荐
- vm centos 添加网卡 无配置文件
vm centos 添加网卡 无配置文件 解决办法 [root@test ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:C8:41:FB ...
- WebDataGrid设置某行某列的值
<ig:WebDataGrid ID="grid" OnRowSelectionChanged="grid_RowSelectionChanged" O ...
- oracle表字段为汉字,依据拼音排序
在order by后面使用NLSSORT函数转化汉字列,如下 select * from student order by NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN ...
- HTML学习体会
HTML介绍 华丽的网页界面,都是由静态网页和一些动态效果,插入的视频,和flash等等,不得不说,静态网页的制作,是学习网页的必经之路,可见静态网页在学习网页的前端是十分重要.静态网页主要是通过ht ...
- JAVA第三周课后作业
JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ...
- <摘录>如何在64位linux强制编译32位应用程序
GDC注:因为需要解决在linux64机上编译32位的mongodb(没办法,因为编译的php是32位,然后我想将mongdb扩展添加到php中),在网上搜了很多文章,感觉这篇好懂,而且好用.我使用的 ...
- (转)Rest介绍
参考文献:Rest简介 REST是一种组织Web服务的架构,其只在架构方面提出了一系列约束. 关于Restful的无状态 所以在stackoverflow中,我们常常会看到有人问:我现在使用了这样一种 ...
- zepto.js之ajax剖析
1.ajax的baseHeaders ajax插件中的baseHeaders对象的是http请求头部的信息 var mime = settings.accepts[dataType], baseHea ...
- 浅谈JavaScript中的事件
引言 Html页面与JavaScript之间的交互是通过事件来完成的.事件,就是文档或者浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(处理程序)来预订事件,以便事件发生时执行相应的代码.这在传 ...
- Xcode 历史版本
概述[编辑] Xcode前身是继承自NeXT的Project Builder. The Xcode suite包含有GNU Compiler Collection自由软件(GCC.apple-darw ...