多通道(Multichannel)单通道(singlechannel)图像概念梳理

时间:2021-12-19 23:50:23

在做机器视觉时,常常要将一个多通道图像分离成几个单通道图像或者将几个单通道图像合成一个多通道图像,以方便图像处理,但是。写这篇博客,是为加深对这两个概念的理解,下面会给出部分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三个通道。除了这两个三通道图像模式,以下列举了还列举一些图像模式(来自百度百科图像模式)

    图像模式:     

1、位图模式
位图模式是1位深度的图像。它只是黑和白两种颜色。它可以由扫描或置入黑色的矢量线条图像生成,也能由灰度模式或双色调模式转换而成。其他图像模式不能直接转换为位图模式。
2、灰度模式
灰度模式是8位深度的图像模式。也就是28,28=256,在全黑和全白之间插有254个灰度等级的颜色来描绘灰度模式的图像。
所有模式的图像都能换成灰度模式,甚至位图也可转换为灰度模式。Photoshop几乎所有的功能都支持灰度模式。
3、双色调模式
双色调模式不是单个的图像模式,而是一个分类。它仅仅是单色调、双色调、三色调和四色调的一个统称。双色调模式只有一个通道。双色调模式和位图模式一样,也只有灰度模式才能转换。
4、RGB模式
RGB模式是数码图像中最重要的一个模式,Photoshop的全部功能都支持它,因为Photoshop就是以它为基础来开发的。显示屏上显示的颜色是RGB模式,电视屏幕也是RGB模式,所不同的它不是用数码而是用电平来描述的。扫描仪和数码相机都是捕捉RGB图像信息的。
RGB模式是相加的模式,当R、G、B的值都达到最大值时,三色合成便成白色。
RGB模式是24位颜色深度。它共有三个通道,每个通道都有8位深度。三个通道合成一起可生成1677万种颜色,我们也称之谓“真彩色”。
5、CMYK模式
CMYK模式是用来打印或印刷的模式,它是相减的模式,当C、M、Y三值达到最大值时,在理论上应为黑色,但实际上因颜料的关系,呈显的不是黑色,而是深褐色。为弥补这个问题,所以加进了黑色K。
由于加了黑色,CMYK共有四个通道,正因为如此,对于同一个图像文件来说,CMYK模式比RGB模式的信息量要大四分之一。
但RGB模式的色域范围比CMYK模式大。因为印刷颜料在印刷过程中不能重现RGB色彩。
CMY和RGB为互补色。
C-青色:由G-绿色和B-蓝色合成,其中没有R-红色成份;
M-洋红:由R-红色和B-蓝色合成,其中没有G-绿色成份;
Y-黄色:由R-绿色和G-红色合成,其中没有B-蓝色成份;
CMYK模式不能转换为索引模式。
Photoshop的大部分功能不支持CMYK模式
6、Lab模式
Lab模式是24位颜色深度的图像模式,有三个通道。L通道是亮度通道(Lightness),a和b两个为色彩通道。它的特点在于:
(1)他的色域范围最广,它和RGB与CMYK模式的关系如下:
就色域范围而言Lab>RGB>CMYK
(2)此模式下的图像是独立于设备外的,它的颜色不会因不同的印刷设备,显示器和操作平台而改变。由于它有以上的有点,当Photoshop把RGB模式和CMYK模式互相转换时,它成为中间模式,颜色信息就不会因以上两模式的色域范围不同而丢失。
a分量是由绿色向红色过度。
B分量是由蓝色向黄色过渡。
Lab模式不能转换为索引模式。
Photoshop的大部分功能不支持Lab模式。
7、索引颜色模式
索引颜色模式是8位颜色深度模式,它最多只能拥有256种颜色。
(1)每一副图像都各自拥有一张颜色表,而随图像不同,颜色表也不同。这一点是至关重要的。
(2)它的信息量小,又可制动画,所以它的图像和动画被广泛地用于网页制作上。
(3)它可制成透明图像,在网页使用。
在转换时,只有灰度和RGB两种模式,不能转换成索引颜色模式。
转换时只有两个选择是实用的:
(随样性 )当图像颜色数大于256时,使用该选项,Photoshop会定做颜色表。实际当图像颜色小于256时,使用该选项,就用实际的颜色制作颜色表。
Photoshop完全不支持索引颜色模式。
8、多通道模式
多通道模式是把含有通道的图像分割成单个的通道。
CMYK模式转为多通道模式时,生成的通道为青色、洋红、黄色和黑色四个通道。
Lab模式转为多通道模式时,生成三个Alpha通道。
9、8位/通道和16位/通道
在灰度、RGB和CMYK模式下可以用每个通道16位深度来取代8位深度。那么,每个通道的颜色数从256色剧增到65536色,可生成更好的颜色细节。
目前,由于设备的不支持,16位/通道的图像不能被打印或印刷。
 
除了这些,还有HSV色系也比较重要,我在另一篇博客上简单的探究了HSV色系,有兴趣可以参考学习。点击
 
图像模式的转换与分离
  在OpenCV中,常用cvCvtColor( const CvArr* src, CvArr* dst, int code );函数将一种模式的图像转换为另一种模式的图像。其中,这个函数的第三个参数code选择要转换的目标图像模式,
OpenCVchm文档中介绍该函数所有可能的色彩空间相互变换有:
RGB<=>XYZ (CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB)
RGB<=>YCrCb (CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB)
RGB=>HSV (CV_BGR2HSV,CV_RGB2HSV) 
RGB=>Lab (CV_BGR2Lab, CV_RGB2Lab)
上面的转换公式可以参考 http://www.cica.indiana.edu/cica/faq/color_spaces/color.spaces.html
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)
下面列举了OpenCV库中的宏定义部分源码,全部可以参考http://artu819.i.sohu.com/blog/view/89684052.htm:(有60多个呢)
/* 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 );
函数将几个单通道图像合并为一个多通道图像。

程序演示
下面简单演示使用这两个函数转换颜色空间(RGB->HSV),然后分离为单通道图像,在将两个单通道图像合成一个双通道图像,可以观察缺少了某个通道后图像的变化。用图像表现,可以更深刻的理解通道和图像模式
代码:
#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)图像概念梳理
1>单通道
多通道(Multichannel)单通道(singlechannel)图像概念梳理
可以观察到,三幅图像都是黑白的,看上去没什么区别(实际上,仔细看,有很多地方不一样的)
 
2>RGB某一个通道空白
多通道(Multichannel)单通道(singlechannel)图像概念梳理
这个有点奇特,蓝色通道空白的图像偏蓝,绿色通道空白的图像偏红,红色通道空白的图像偏黄,
3>HSV某通道空白
多通道(Multichannel)单通道(singlechannel)图像概念梳理
很显然V亮度为空,图像肯定是黑色的了。
                       http://blog.sina.com.cn/s/blog_520a9c1d0100b8hr.html

多通道(Multichannel)单通道(singlechannel)图像概念梳理的更多相关文章

  1. tensorflow tensor Flatten 张量扁平化,多通道转单通道数据

    slim.flatten(inputs,outputs_collections=None,scope=None) (注:import tensorflow.contrib.slim as slim)  ...

  2. opencv C&plus;&plus;构造并访问单通道和多通道Mat。

    一:构造并访问单通道. int main(){ cv::Mat m=(cv::Mat_<int>(3,2)<<1,2,3,4,5,6); for(int i=0;i<m. ...

  3. C&plus;&plus; opencv 滑动条 Trackbary以及处理三通道和单通道图像

    #include <opencv2\core.hpp> #include <opencv2\highgui.hpp> #include <opencv2\imgproc. ...

  4. stm32之ADC应用实例(单通道、多通道、基于DMA)

    文本仅做记录.. 硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗).  所用的芯片内嵌 ...

  5. stm32之ADC应用实例(单通道、多通道、基于DMA)-转载精华帖,最后一部分的代码是精华

    硬件:STM32F103VCT6    开发工具:Keil uVision4    下载调试工具:ARM仿真器网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗).所用的芯片内嵌3个12位的 ...

  6. STM32F10x&lowbar;ADC三通道逐次转换&lpar;单次、单通道软件触发&rpar;

    Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...

  7. 使用opencv为没有透明通道的图像加入透明通道

    在图像处理中,我们经常需要处理带透明通道的图片,比如为图片或视频添加水印,为图片或视频添加字幕.贴图等.然而,我们的素材图片未必总是带有透明通道.比如,素材的背景本该透明的地方,却是黑色和白色.有时, ...

  8. &lbrack;DOM Event Learning&rsqb; Section 2 概念梳理 什么是事件 DOM Event

    [DOM Event Learning] Section 2 概念梳理 什么是事件 DOM Event   事件 事件(Event)是用来通知代码,一些有趣的事情发生了. 每一个Event都会被一个E ...

  9. RH6030 单通道触摸感应开关

    1.概述: RH6030 是一款单通道电容式触摸感应控制开关IC,可以替代传统的机械式开关. 该 IC 采用CMOS 工艺制造,结构简单,性能稳定.IC 可通过外部引脚配置成多种工作模式,可广泛应用于 ...

随机推荐

  1. jstl foreach标签

    forEach标签 forEach标签用来循环. 属性: * var :定义循环变量 * begin :从哪开始 * end :到哪结束 * step :递增 * items :遍历的内容 * var ...

  2. Other linker flags

    -ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使 ...

  3. 递推DP POJ 1163 The Triangle

    题目传送门 题意:找一条从顶部到底部的一条路径,往左下或右下走,使得经过的数字和最大. 分析:递推的经典题目,自底向上递推.当状态保存在a[n][j]时可省去dp数组,空间可优化. 代码1: /*** ...

  4. Vsftp的PASV mode和Port模式配置文件的设置

    FTP模式与数据端口 FTP 分为两类,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP.这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认 ...

  5. android 自定义view之选座功能

    效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手指缩放时跟随缩放 主要技术点 ...

  6. ubuntu开机自动启动服务

    编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.当然要添加到语句:exit 0 前面才行.如: ...

  7. Alpha&lpar;7&sol;10&rpar;

    鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...

  8. 洛谷CF868F Yet Another Minimization Problem(动态规划,决策单调性,分治)

    洛谷题目传送门 貌似做所有的DP题都要先搞出暴力式子,再往正解上靠... 设\(f_{i,j}\)为前\(i\)个数分\(j\)段的最小花费,\(w_{l,r}\)为\([l,r]\)全在一段的费用. ...

  9. Fedora Server 21 安装 搜狗拼音输入法

    最新文章:Virson’s Blog 借鉴文章:博客园-怒杀神殿    ChinaUnix-firo 百度贴吧-fedora吧 方法一:解压deb安装包方式安装: 如果本机已安装ibus,需要先卸载, ...

  10. python中read&lpar;&rpar;、readline&lpar;&rpar;、readlines&lpar;&rpar;函数

    python文件读read().readline().readlines()对比   目录 一.read方法 二.readline方法 三.readlines方法 正文 读取文件的三个方法:read( ...