OpenCV學習之Mat資料按位操作與通道分離合併

2021-08-02 06:31:12 字數 2769 閱讀 1368

以前一直用matlab做影象**,這次學習opencv後,第一步就是讀取影象,並對影象進行位操作,在opencv中比較重要和基礎的乙個資料結構是mat,針對mat型結構的位處理,進行了以下試驗。

#include

#include

#include

#include

#include"hessianhead.h"

using

namespace cv;

using

namespace

std;

#define name1 "圖一_3通道_ptr_8位有符號"

#define name2 "圖二_3通道_at_8位有符號"

#define name3 "圖三_1通道_at_8位無符號"

#define name4 "圖四_對分離後的channel進行操作"

#define name5 "圖五_直接生成channel再進行合併"

int main()

}namedwindow(name1, window_normal);

imshow(name1, emptyimg1);

namedwindow(name2, window_normal);

imshow(name2, emptyimg2);

//這裡是8通道無符號的賦值

mat emptyimg3(20, 20, cv_8uc1);

for (int i = 0; i < 20; i++)

}namedwindow(name3, window_normal);

imshow(name3, emptyimg3);

//通道分離與合併

mat emptyimg4(20, 20, cv_8sc3);

mat megeimg1, megeimg2;

vector

channels;

vector

channelsformege;

mat imgbluechannel;

mat imggraychannel;

mat imgredchannel;

//分離處顏色通道

split(emptyimg4, channels);

/* imgbluechannel=channels.at(0);

imggraychannel=channels.at(1);

imgredchannel=channels.at(2);

*///方法二:也可以拷貝資料到新的mat空間,修改後原圖不變

channels.at(0).copyto(imgbluechannel);

channels.at(1).copyto(imggraychannel);

channels.at(2).copyto(imgredchannel);

for (int i = 0; i < 20; i++)

}//使用方法二:需要重新做乙個通道向量以便利用merge函式

//這裡應該按先後順序,按照b-g-r的順序存入;

channelsformege.push_back(imgbluechannel);

channelsformege.push_back(imggraychannel);

channelsformege.push_back(imgredchannel);

//*合併通道

merge(channelsformege, megeimg2);

merge(channels, megeimg1);

namedwindow(name4, window_normal);

namedwindow(name5, window_normal);

imshow(name4, megeimg1);

imshow(name5, megeimg2);

mat emptyimg6(20, 20, cv_32fc3);//(輸入資料型別為32位float型)

double gr = 228 / 255;

for (int i = 0; i < emptyimg6.rows; i++)

}cout

<< gr;

namedwindow("six", window_normal);

imshow("six", emptyimg6);

waitkey(0);

return

0;}

試驗結果圖

1.按位操作,可以用mat的at和ptr函式來實現,兩者的寫法不同,對位置位(i,j)處的畫素,兩者的表示的是at(i,j),ptr(i)[j];

2.彩色影象在opencv中的儲存通道順序是b-g-r,對彩色影象進行通道分離,可以利用split(srcimg, channels),這裡channels是乙個mat型別的通道向量,可以通過at提取出來;

3.對多個通道合併可以用merge(channels,dstimg)函式,這裡這裡channels是乙個mat型別的通道向量,並按bgr的順序在0-2的位置存放對應色彩通道資料,其中,通道向量可以用vector channels建立,並用channels.push_back( )按b-g-r的先後順序存入;

4.對於1中的type型別,如果影象開始建立的型別為8s/8u,這裡type對應著char/uchar,其賦值範圍為-127~127/0~255;若初始建立型別為32f,則type型別可用float,賦值範圍為0~1,小數點後幾位。(此條待進一步修正)

opencv學習筆記之Mat元素訪問

mat元素訪問方法如下 declare template tp cv mat at int i0 0 cv mat h 100 100 cv 64f 初始化 for int i 0 i h.rows i for int j 0 j h.cols j h.at double i,j 1.i j 1 賦...

OpenCV之Mat類詳解

學習mat矩陣,了解影象的儲存和mat矩陣的使用 2001年opencv剛出來的時候,是基於c語言介面而建。為了在記憶體 memory 中存放影象,當時採用名為 iplimage 的c語言結構體。其中最大的不足要數手動記憶體管理,使用者要為開闢和銷毀記憶體負責。一旦 開始變得越來越龐大,會越來越多地...

OpenCV 學習筆記(一)Mat

opencv是由c語言實現的,實際上它使用的結構體也是遵循物件導向思想設計的,iplimage由cvmat派生 資訊 和乙個指向儲存所有畫素值的矩陣 根據所選儲存方法的不同矩陣可以是不同的維數 的指標。mat矩陣頭 包括 typedef struct cvmat data ifdef cpluspl...