opencv结构操作与运算---通道的分割与合并cvSplit(),cvMerge(),cvMixChannels()

转载 2015年07月08日 13:40:18
通道的分割與合併,用到的是cvSplit()cvMerge(),它可以把多通道分割成單通道,並且也可以把單通道都合併成多通道,下面的實作為利用通道分割與合併,將該圖的RGB值分開,並且個別的顯示出來,可以知道一張圖片RGB值的分佈狀況.

擷取RGB圖片,通道的分割與合併:
#include
#include

int main()
{
IplImage *Image1;
IplImage *RedImage,*GreenImage,*BlueImage;
IplImage *Channel1,*Channel2,*Channel3;
CvSize Size1;
Image1=cvLoadImage("grotto.jpg",1);
Size1=cvGetSize(Image1);

Channel1=cvCreateImage(Size1,IPL_DEPTH_8U,1);
Channel2=cvCreateImage(Size1,IPL_DEPTH_8U,1);
Channel3=cvCreateImage(Size1,IPL_DEPTH_8U,1);
cvSplit(Image1,Channel1,Channel2,Channel3,0);

BlueImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
GreenImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
RedImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
cvMerge(Channel1,0,0,0,BlueImage);
cvMerge(0,Channel2,0,0,GreenImage);
cvMerge(0,0,Channel3,0,RedImage);

cvNamedWindow("Red pic",1);
cvShowImage("Red pic",RedImage);
cvNamedWindow("Green pic",1);
cvShowImage("Green pic",GreenImage);
cvNamedWindow("Blue pic",1);
cvShowImage("Blue pic",BlueImage);

cvWaitKey(0);
}
上面的程式碼先讀取了圖檔,再創立了空的uchar型別單通道IplImage資料結構,各分成三個通道的資料結構,利用cvSplit()將圖形的通道分割,因此Channel1,Channel2,Channel3都取得數值了,cvSplit()第五個引數為第四個通道的資料結構,因為是讀取一般的圖檔,只需要三個通道,所以將它設置為0,再來是創立三個通道為三的RGB圖形IplImage資料結構,利用cvMerge()置入RGB顏色個別的通道,不需要用到的通道就設為0,因此,RGB圖片就順利被擷取出來了.


對於多通道的混合,就要用到cvMixChannels()這個函式啦,他可做到連續多張輸出,輸入的圖片它的所有通道數做隨意的配置但是它的函式還是有些遊戲規則要注意的.

通道混合的實作:
#include
#include


int from_to[]={3,0
,2,1
,1,2
,0,3};//定义 通道 交换规则
int main()
{
IplImage *Image1,*Image2;
IplImage *GrayRGBImage;

CvSize Size1;
Image1=cvLoadImage("grotto.jpg",1);
Image2=cvLoadImage("grotto.jpg",0);
Size1=cvGetSize(Image1);
GrayRGBImage=cvCreateImage(Size1,IPL_DEPTH_8U,4);//四通道输出

CvArr const *src[]={Image1,Image2};//输入两张图,彩色RGB三通道和一个灰度单通道图
CvArr *dst[]={GrayRGBImage};//输出一张图,四通道

cvMixChannels(src,2,dst,1,from_to,4);//【核心】

cvNamedWindow("MixChannels",1);
cvShowImage("MixChannels",GrayRGBImage);
cvWaitKey(0);
}
上面將grotto.jpg的彩圖跟灰階圖分別用cvLoadImage()讀出來,而對於Image2的灰階圖,cvLoadImage()這個函式將它的灰階值存成了三個通道,接著再用IplImage資料結構創立一個自定義的通道格式"灰階+紅色+綠色+藍色",這邊,cvMixChannels()的函式內,目標圖(src)跟輸出圖(dst)都要放在一維陣列內,因為他可以對連續多張圖片做通道的混合,第一個引數為輸入CvArr結構的圖形陣列,第二個引數為他輸入的圖形個數,第三個為輸出的CvArr結構圖形陣列,再來是輸出的圖形個數,下一個引數,為通道交換的規則,from_to的陣列內,數據的意義以兩個為一組,分別為將輸入的第三個通道置入輸出的第零的通道,第二個通道放第一個通道,第一個通道放第二個通道,第零個通道放入第三個通道,依此類推,由於輸入為兩張圖片,一張全彩圖,一張灰階圖,總通道數為4,灰階圖的為單通道uchar型別的矩陣型態,這邊from_to就是用輸出跟輸入的總通道數做交換的,第五個引數為被選取多少通道數,有四個通道被混合,因此from_to的陣列空間就為8。

from_to陣列的對應:
輸入圖形共4個通道,輸出圖形亦是4個通道,選取了四組通道被混合。
cvSplit()
將多通道的圖形分割成單通道的圖形,第一個引數為輸入目標多通道圖形結構,第二,,,五個引數為輸出通道的圖形資料結構,輸出必須放單通道uchar型別的IplImageCvMat矩陣資料結構
cvSplit(輸入多通道IplImageCvMat資料結構圖形,輸出單通道IplImageCvMat資料結構,輸出單通道IplImageCvMat資料結構,輸出單通道IplImageCvMat資料結構,輸出單通道IplImageCvMat資料結構)

cvMerge()
合併單通道矩陣為成為多通道的圖形,前四個引數為單通道uchar型別的資料結構,第五個引數為輸出IplImage資料結構或CvMat結構圖形
cvMerge(輸入單通道IplImageCvMat資料結構,輸入單通道IplImageCvMat資料結構,輸入單通道IplImageCvMat資料結構,輸入單通道IplImageCvMat資料結構,輸出多通道IplImageCvMat資料結構圖形)

cvMixChannels()
將多張圖形的通道做混合,輸入及輸出支援多張圖形,因此要放置在圖形陣列上,第一個引數為輸入CvArr圖形陣列,第二個為輸入圖形的個數,第三個為輸出CvArr圖形陣列,第四個為輸出圖形陣列的個數,第五個為通道數混合方式的陣列,第五個是被用到的總通道數
cvMixChannels(CvArr輸入圖形陣列,總輸入圖形數目,CvArr輸出圖形陣列,總輸出圖形數目,混合通道方式數據陣列,被混合的通道數)

OpenCv学习笔记(四):使用split函数提取彩色图像的三个通道

split函数的主要功能是把一个彩色图像分割成3个通道,方便进一步的图像处理,具体说明如下: split Divides a multi-channel array into several sin...

【opencv学习】之split函数提取多通道图像的单通道图像

首先解释下什么是多通道图像,一个普通的彩色图像的每个像素点是由RGB三种颜色构成的,那么这种图像就是3通道图像,其中单独的R色、G色和B色都分别称为一个单通道图像。opencv中的Mat类型实际上可以...
  • SuperWe
  • SuperWe
  • 2016年04月26日 20:43
  • 5660

opencv函数之mixChannels

Copies specified channels from input arrays to the specified channels of output arrays.从输入中拷贝某通道到输出中...

opencv中mixChannels的使用方法

mixChannels的使用方法 Copies specified channels from input arrays to the specified channels of output arr...

[OpenCV基础] OpenCV中对mixChannels函数的理解

mixChannels Copies specified channels from input arrays to the specified channels of output array...

【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解

在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理;有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像。opencv2和opencv3中实现图像通道的合并与分...

OpenCV-颜色通道的分离、合并

OpenCV-颜色通道的分离、合并author@jason_ql http://blog.csdn.net/lql0716 OpenCV-颜色通道的分离、合并 颜色通道的分离:split() c...
  • lql0716
  • lql0716
  • 2017年02月16日 14:08
  • 1563

【OpenCV入门教程之五】 分离颜色通道&多通道图像混合

上篇文章中我们讲到了使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操作。 而为了更好的观察一些图像材料的特征,有时需要对R...
  • zhmxy555
  • zhmxy555
  • 2014年03月13日 17:09
  • 92881

Opencv.mixChannels用法

mixChannels Copies specified channels from input arrays to the specified channels of output array...
  • lenok
  • lenok
  • 2013年05月15日 20:17
  • 2117

opencv cvSplit cvMerge

/* Splits a multi-channel array into the set of single-channel arrays or extracts particular [col...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv结构操作与运算---通道的分割与合并cvSplit(),cvMerge(),cvMixChannels()
举报原因:
原因补充:

(最多只允许输入30个字)