国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Opencv-C++筆記 (9) : opencv-多通道分離和合并

這篇具有很好參考價(jià)值的文章主要介紹了Opencv-C++筆記 (9) : opencv-多通道分離和合并。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、概論

在圖像顏色模型中不同的分量存放在不同的通道中,如果我們只需要顏色模型的某一個(gè)分量,例如只需要處理RGB圖像中的紅色通道,可以將紅色通道從三通道的數(shù)據(jù)中分離出來再進(jìn)行處理,這種方式可以減少數(shù)據(jù)所占據(jù)的內(nèi)存,加快程序的運(yùn)行速度。同時(shí),當(dāng)我們分別處理完多個(gè)通道后,需要將所有通道合并在一起重新生成RGB圖像。針對(duì)圖像多通道的分離與混合,OpenCV 4中提供了split()函數(shù)和merge()函數(shù)用于解決這些需求。
opencv知識(shí)點(diǎn):

  • 通道分離 - split() 通道合并
  • merge() 通道混合
  • mixChannels()

二、多通道分離函數(shù)split()

OpenCV 4中針對(duì)多通道分離函數(shù)split()有兩種重載原型,在代碼清單3-4中給出了這兩種函數(shù)原型。

void cv::split(const Mat & src,
                 Mat * mvbegin
                 )
void cv::split(InputArray m,
                 OutputArrayOfArrays mv
                 )

src:待分離的多通道圖像。
mvbegin:分離后的單通道圖像,為數(shù)組形式,數(shù)組大小需要與圖像的通道數(shù)相同
m:待分離的多通道圖像
mv:分離后的單通道圖像,為向量vector形式
該函數(shù)主要是用于將多通道的圖像分離成若干單通道的圖像,兩個(gè)函數(shù)原型中不同之處在于前者第二個(gè)參數(shù)輸入的是Mat類型的數(shù)組,其數(shù)組的長度需要與多通道圖像的通道數(shù)相等并且提前定義;第二種函數(shù)原型的第二個(gè)參數(shù)輸入的是一個(gè)vector容器,不需要知道多通道圖像的通道數(shù)。兩個(gè)函數(shù)原型雖然輸入?yún)?shù)的類型不同,但是通道分離的原理是相同的,可以用公式(3.4)表示。
Opencv-C++筆記 (9) : opencv-多通道分離和合并

三、多通道合并函數(shù)merge()

OpenCV 4中針對(duì)多通道合并函數(shù)merge()也有兩種重載原型,在代碼清單3-5中給出了兩種原型。多通道合并函數(shù)merge()
OpenCV 4中針對(duì)多通道合并函數(shù)merge()也有兩種重載原型,在代碼清單3-5中給出了兩種原型。

void cv::merge(const Mat * mv,
                  size_t  count,
                  OutputArray dst
                 ) 
void cv::merge(InputArrayOfArrays mv,
                  OutputArray dst
                 )

mv:需要合并的圖像數(shù)組,其中每個(gè)圖像必須擁有相同的尺寸和數(shù)據(jù)類型。
count:輸入的圖像數(shù)組的長度,其數(shù)值必須大于0.
mv:需要合并的圖像向量vector,其中每個(gè)圖像必須擁有相同的尺寸和數(shù)據(jù)類型。
dst:合并后輸出的圖像,與mv[0]具有相同的尺寸和數(shù)據(jù)類型,通道數(shù)等于所有輸入圖像的通道數(shù)總和。
該函數(shù)主要是用于將多個(gè)圖像合并成一個(gè)多通道圖像,該函數(shù)也具有兩種不同的函數(shù)原型,每一種函數(shù)原型都是與split()函數(shù)相對(duì)應(yīng),兩種原型分別輸入數(shù)組形式的圖像數(shù)據(jù)和向量vector形式的圖像數(shù)據(jù),在輸入數(shù)組形式數(shù)據(jù)的原型中,還需要輸入數(shù)組的長度。合并函數(shù)的輸出結(jié)果是一個(gè)多通道的圖像,其通道數(shù)目是所有輸入圖像通道數(shù)目的總和。這里需要說明的是,用于合并的圖像并非都是單通道的,也可以是多個(gè)通道數(shù)目不相同的圖像合并成一個(gè)通道更多的圖像,雖然這些圖像的通道數(shù)目可以不相同,但是需要所有圖像具有相同的尺寸和數(shù)據(jù)類型

//函數(shù)定義
void channels_demo(Mat& image);

//函數(shù)實(shí)現(xiàn)—
void QuickDemo::channels_demo(Mat& image) {

	Mat mvt[3];
	/*
	第一種方式
		通過創(chuàng)建圖像數(shù)組,存儲(chǔ)每個(gè)單通道圖像
	*/
	split(image, mvt);

	imshow("藍(lán)色單通道", mvt[0]);
	imshow("綠色單通道", mvt[1]);
	imshow("藍(lán)色單通道", mvt[2]);
}
void QuickDemo::channels_demo(Mat& image) {

	std::vector<Mat> mvt;
	/*
	第二種方式
		通過創(chuàng)建動(dòng)態(tài)數(shù)組,存儲(chǔ)每個(gè)單通道圖像
	*/
	split(image, mvt);

	imshow("藍(lán)色單通道", mvt[0]);
	imshow("綠色單通道", mvt[1]);
	imshow("紅色單通道", mvt[2]);
}

這里我們進(jìn)行一個(gè)演示,實(shí)現(xiàn)如下通道的混合

0通道→2通道
1通道不變
2通道→1通道

這個(gè)混合的意思是,彩色圖像本來是bgr的順序,經(jīng)過通道混合就變成了rgb。

0通道的單通道圖像,變成了2通道的單通道圖像
1通道不變
2通道的單通道圖像,變成了0通道的單通道圖像

void QuickDemo::channels_demo(Mat& image) {

	Mat dst = Mat::zeros(image.size(), image.type());

	int from_to[] = { 0,2,1,1,2,0 };

	mixChannels(&image, 1, &dst, 1, from_to, 3);
	
	imshow("通道混合",dst);
}

Opencv-C++筆記 (9) : opencv-多通道分離和合并
Opencv-C++筆記 (9) : opencv-多通道分離和合并

Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) );
Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );
Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );
// forming an array of matrices is a quite efficient operation,
// because the matrix data is not copied, only the headers
Mat out[] = { bgr, alpha };
// bgra[0] -> bgr[2], bgra[1] -> bgr[1],
// bgra[2] -> bgr[0], bgra[3] -> alpha[0]
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
mixChannels( &bgra, 1, out, 2, from_to, 4 );

四、圖像多通道分離與合并例程

為了使讀者更加熟悉圖像多通道分離與合并的操作,同時(shí)加深對(duì)圖像不同通道作用的理解,在代碼清單3-6中實(shí)現(xiàn)了圖像的多通道分離與合并的功能。程序中用兩種函數(shù)原型分別分離了RGB圖像和HSV圖像,為了驗(yàn)證merge ()函數(shù)可以合并多個(gè)通道不相同的圖像,程序中分別用兩種函數(shù)原型合并了多個(gè)不同通道的圖像,合并后圖像的通道數(shù)為5,不能通過imshow()函數(shù)顯示,我們用Image Watch插件查看了合并的結(jié)果。由于RGB三個(gè)通道分離結(jié)果顯示時(shí)都是灰色且相差不大,因此圖3-5沒有給出其分離后的結(jié)果,只給出合并后顯示為綠色的合并圖像,同時(shí)給出HSV分離結(jié)果,其他結(jié)果讀者可以自行運(yùn)行程序查看。

void QuickDemo::channels_demo(Mat& image) {

	Mat mvt[3];
	
	split(image, mvt);

	imshow("藍(lán)色單通道", mvt[0]);
	imshow("綠色單通道", mvt[1]);
	imshow("紅色單通道", mvt[2]);

	Mat dst;
	
	merge(mvt,3,dst);
	/*
	這里的3指,共有3個(gè)單通道圖像
	*/
	imshow("分離再合并",dst);

}
void QuickDemo::channels_demo(Mat& image) {

	std::vector<Mat> mvt;

	split(image, mvt);

	imshow("藍(lán)色單通道", mvt[0]);
	imshow("綠色單通道", mvt[1]);
	imshow("紅色單通道", mvt[2]);

	Mat dst;

	merge(mvt, dst);

	imshow("分離再合并",dst);

}
#include<iostream>
#include<vector>
#include<string>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main(int argc,char** argv) {
    cout<<"OpenCv Version: "<<CV_VERSION<<endl;
    Mat img=imread("/home/wyh/Documents/C++demo/699342568.jpg");
    if(img.empty()){
        cout<<"請(qǐng)確認(rèn)輸入圖片的名稱是否正確"<<endl;
        return -1;
    }
    Mat HSV,dst;
    resize(img,dst,Size(img.cols*0.5,img.rows*0.5));
    cvtColor(dst,HSV,COLOR_BGR2HSV);
    Mat imgs0,imgs1,imgs2;//用于存放數(shù)組類型的結(jié)果
    Mat imgv0,imgv1,imgv2;//用于存放vector類型的結(jié)果
    Mat result0,result1,result2;//多通道合并的結(jié)果

    //輸入數(shù)組參數(shù)的多通道分離與合并
    Mat imgs[3];
    split(dst,imgs);
    imgs0=imgs[0];
    imgs1=imgs[1];
    imgs2=imgs[2];
    imshow("RGB-R通道",imgs0);//顯示分離后R通道的像素值
    imshow("RGB-G通道",imgs1);//顯示分離后G通道的像素值
    imshow("RGB-B通道",imgs2);//顯示分離后B通道的像素值
    imgs[2]=dst;//將數(shù)組中的圖像通道數(shù)變成不統(tǒng)一
    merge(imgs,3,result0);//合并圖像

    Mat zero=Mat::zeros(dst.rows,dst.cols,CV_8UC1);
    imgs[0]=zero;
    imgs[2]=zero;
    merge(imgs,3,result1);//用于還原G通道的真實(shí)情況,合并結(jié)果為綠色
    imshow("result1",result1);//顯示合并結(jié)果

    //輸入vector參數(shù)的多通道分離與合并
    vector<Mat>imgv;
    split(HSV,imgv);
    imgv0=imgv.at(0);
    imgv1=imgv.at(1);
    imgv2=imgv.at(2);
    imshow("HSV-H通道",imgv0);//顯示分離后H通道的像素值
    imshow("HSV-S通道",imgv1);//顯示分離后S通道的像素值
    imshow("HSV-V通道",imgv2);//顯示分離后V通道的像素值
    imgv.push_back(HSV);//將vector中的圖像通道數(shù)變成不統(tǒng)一
    merge(imgv,result2);//合并圖像
    waitKey(0);
    return 0;
}

Opencv-C++筆記 (9) : opencv-多通道分離和合并文章來源地址http://www.zghlxwxcb.cn/news/detail-491109.html

到了這里,關(guān)于Opencv-C++筆記 (9) : opencv-多通道分離和合并的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Opencv-C++筆記 (12) : opencv-仿射變化

    Opencv-C++筆記 (12) : opencv-仿射變化

    介紹完圖像的縮放和翻轉(zhuǎn)后,接下來將要介紹圖像的旋轉(zhuǎn),但是在OpenCV 4中并沒有專門用于圖像旋轉(zhuǎn)的函數(shù),而是通過圖像的仿射變換實(shí)現(xiàn)圖像的旋轉(zhuǎn)。實(shí)現(xiàn)圖像的旋轉(zhuǎn)首先需要確定旋轉(zhuǎn)角度和旋轉(zhuǎn)中心,之后確定旋轉(zhuǎn)矩陣,最終通過仿射變換實(shí)現(xiàn)圖像旋轉(zhuǎn)。 針對(duì)這個(gè)流程,

    2024年02月11日
    瀏覽(88)
  • Opencv-C++筆記 (2) : opencv的矩陣操作

    Opencv-C++筆記 (2) : opencv的矩陣操作

    OpenCV中的矩陣操作非常重要,本文總結(jié)了矩陣的創(chuàng)建、初始化以及基本矩陣操作,給出了示例代碼,主要內(nèi)容包括: 建立矩陣必須要指定矩陣存儲(chǔ)的數(shù)據(jù)類型,圖像處理中常用的幾種數(shù)據(jù)類型如下: 包括數(shù)據(jù)位深度8位、32位,數(shù)據(jù)類型U:uchar、F:float型以及通道數(shù)C1:單通道、

    2024年02月11日
    瀏覽(98)
  • Opencv-C++筆記 (10) : opencv-圖像像素計(jì)算

    Opencv-C++筆記 (10) : opencv-圖像像素計(jì)算

    我們可以將數(shù)字圖像理解成一定尺寸的矩陣,矩陣中每個(gè)元素的大小表示了圖像中每個(gè)像素的亮暗程度,因此統(tǒng)計(jì)矩陣中的最大值,就是尋找圖像中灰度值最大的像素,計(jì)算平均值就是計(jì)算圖像像素平均灰度,可以用來表示圖像整體的亮暗程度。因此針對(duì)矩陣數(shù)據(jù)的統(tǒng)計(jì)工作

    2024年02月09日
    瀏覽(88)
  • Opencv-C++筆記 (5) : opencv-形態(tài)學(xué)

    Opencv-C++筆記 (5) : opencv-形態(tài)學(xué)

    形態(tài)學(xué)運(yùn)算是針對(duì)二值圖像依據(jù)數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology)的集合論方法發(fā)展起來的圖像處理方法。數(shù)學(xué)形態(tài)學(xué)起源于巖相學(xué)對(duì)巖石結(jié)構(gòu)的定量描述工作,近年來在數(shù)字圖像處理和機(jī)器視覺領(lǐng)域中得到了廣泛的應(yīng)用,形成了一種獨(dú)特的數(shù)字圖像分析方法和理論。 結(jié)構(gòu)元素

    2024年02月09日
    瀏覽(94)
  • Opencv-C++筆記 (6) : opencv-圖片和視頻操作

    Opencv-C++筆記 (6) : opencv-圖片和視頻操作

    filename:需要讀取圖像的文件名稱,包含圖像地址、名稱和圖像文件擴(kuò)展名 flags:讀取圖像形式的標(biāo)志,如將彩色圖像按照灰度圖讀取,默認(rèn)參數(shù)是按照彩色圖像格式讀取,可 選參數(shù)在表2-3給出。 函數(shù)用于讀取指定的圖像并將其返回給一個(gè)Mat類變量,如果圖像文件不存在、破

    2024年02月09日
    瀏覽(88)
  • Opencv-C++筆記 (18) : 輪廓和凸包

    Opencv-C++筆記 (18) : 輪廓和凸包

    輪廓發(fā)現(xiàn)是基于圖像邊緣提取的基礎(chǔ)尋找對(duì)象輪廓的方法。 所以邊緣提取的閾值選定會(huì)影響最終輪廓發(fā)現(xiàn)結(jié)果 輪廓查找步驟: 輸入圖像轉(zhuǎn)為灰度圖像cvtColor 使用Canny進(jìn)行邊緣提取或者threshold閾值操作,得到二值圖像 使用findContours尋找輪廓 使用drawContours繪制輪廓 在二值圖像

    2024年02月11日
    瀏覽(94)
  • Opencv-C++筆記 (7) : opencv-文件操作XML和YMAL文件

    Opencv-C++筆記 (7) : opencv-文件操作XML和YMAL文件

    除了圖像數(shù)據(jù)之外,有時(shí)程序中的尺寸較小的Mat類矩陣、字符串、數(shù)組等 數(shù)據(jù)也需要進(jìn)行保存,這些數(shù)據(jù)通常保存成XML文件或者YAML文件。本小節(jié)中將介紹如何利用OpenCV 4中的函數(shù)將數(shù)據(jù)保存成XML文件或者YAML文件以及如何讀取這兩種文件中的數(shù)據(jù)。 XML是一種元標(biāo)記語言,所謂

    2024年02月09日
    瀏覽(94)
  • Opencv-C++筆記 (3) : opencv的庫介紹以及和C++對(duì)接轉(zhuǎn)換

    Opencv-C++筆記 (3) : opencv的庫介紹以及和C++對(duì)接轉(zhuǎn)換

    calib3d 主要包含相機(jī)標(biāo)定,立體視覺的功能:物體姿勢(shì)估計(jì),三維重建,攝像頭標(biāo)定 core,包含庫的基本結(jié)構(gòu)和操作,比如數(shù)據(jù)結(jié)構(gòu),繪圖函數(shù),數(shù)組操作等函數(shù) dnn,深度學(xué)習(xí)模塊,包含構(gòu)建網(wǎng)絡(luò),加載序列化的模型,但是不支持訓(xùn)練,只能推理 features2d,處理圖像特征點(diǎn),特

    2024年02月09日
    瀏覽(91)
  • OpenCV - 圖片增加透明通道,圖片合并透明通道

    一般人像摳圖相關(guān)的AI模型會(huì)輸出一個(gè)Mask圖,這個(gè)Mask圖就是我們需要的可以將人物摳出來的Alpha通道信息,我們需要將這個(gè)Mask圖附加到原始圖片上,從BGR圖片轉(zhuǎn)成BGRA圖片或者從RGB圖片轉(zhuǎn)成RGBA圖片。 如果使用OpenCV進(jìn)行圖像處理,在為圖像增加透明通道時(shí)會(huì)使用到 cv::split 和

    2024年02月16日
    瀏覽(21)
  • Opencv-C++筆記 (15) : 像素重映射 與 圖像扭曲

    Opencv-C++筆記 (15) : 像素重映射 與 圖像扭曲

    重映射,就是把一幅圖像中某位置的像素放置到另一圖像指定位置的過程。即: 在重映射過程中,圖像的大小也可以同時(shí)發(fā)生改變。此時(shí)像素與像素之間的關(guān)系就不是一一對(duì)應(yīng)關(guān)系,因此在重映射過程中,可能會(huì)涉及到像素值的插值計(jì)算。 頭文件 quick_opencv.h:聲明類與公共

    2024年02月13日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包