OpenCV 操作畫素(訪問畫素值)

2021-09-11 03:21:01 字數 1946 閱讀 7551

為構建計算機視覺應用程式,我們需要學會訪問影象的內容,有時也要修改或者建立影象。本章將講講如何操作影象的元素(即畫素)。

影象本質上就是由陣列組成的矩陣。opencv使用了cv:mat結構來操作影象。矩陣中的每乙個元素表示乙個畫素。對灰度影象而言,畫素是8位無符號數(資料型別為unsigned char),0表示黑色,255表示白色。

cv::mat 類包含多種方法,可用來訪問影象的各種屬性:利用公共成員變數cols 和rows可得到影象的列數和行數;利用cv::mat 的at(int y,int x)方法可以訪問元素,其中x 是列號,y 是行號。at 方法被實現成乙個模板方法。在呼叫at 方法時,必須指定影象元素的型別,例如:

image.at(j,i)= 255;

有一點需要特別注意,必須保證指定的型別與矩陣內的型別是一致的。at 方法不會進行任何型別轉換。

彩色影象的每個畫素對應三個部分:紅色通道、綠色通道和藍色通道,因此包含彩色影象的cv::mat 類會返回乙個向量,向量中包含三個8 位的數值。opencv 為這樣的短向量定義了一種型別,即cv::vec3b。這個向量包含三個無符號字元(unsigned character)型別的資料。因此,訪問彩色畫素中元素的方法如下所示:

image.atcv::vec3b(j,i)[channel]= value;

channel 索引用來指明三個顏色通道中的乙個。opencv 儲存通道資料的次序是藍色、綠色和紅色(因此藍色是通道0)。你也可以直接使用短向量,方法如下所示:

image.atcv::vec3b(j, i) = cv::vec3b(255, 255, 255);

還有類似的向量型別用來表示二元素向量和四元素向量(cv::vec2b 和cv::vec4b)。此外還有針對其他元素型別的向量。例如,表示二元素浮點數型別的向量就是把型別名稱的最後乙個字母換成f,即cv::vec2f。對於短整型,最後的字母換成s;對於整型,最後的字母換成i;對於雙精度浮點數向量,最後的字母換成d。所有這些型別都用cv::vec模板類定義,其中t 是型別,n 是向量元素的數量。

最後乙個提示,你也許會覺得奇怪,為什麼這些修改影象的函式在使用影象作為引數時,都

採用了值傳遞的方式?之所以這樣做,是因為它們在複製影象時仍共享了同一塊影象資料。因此

在需要修改影象內容時,影象引數沒必要採用引用傳遞的方式。順便說一下,編譯器做**優化

時,用值傳遞引數的方法通常比較容易實現。

擴充套件cv::mat 類的定義採用了c++模板,因此它的通用性很強。

cv::mat_模板類

因為每次呼叫都必須在模板引數中指明返回型別,所以cv::mat 類的at 方法有時會顯得冗長。如果已經知道矩陣的型別,就可以使用cv::mat_類(cv::mat 類的模板子類)。cv::mat_類定義了一些新的方法,但沒有定義新的資料屬性,因此這兩個類的指標或引用可以直接互相轉換。新方法中有乙個operator(),可用來直接訪問矩陣的元素。因此可以這樣寫**(其中image是乙個對應uchar 矩陣的cv::mat 變數):

// 用mat 模板操作影象

cv::mat_ img(image);

img(50,100)= 0; // 訪問第50 行、第100 列處那個值

在建立cv::mat_變數時,我們就定義了它的元素型別,因此在編譯時就已經知道了operator()的返回型別。使用操作符operator()和使用at 方法產生的結果是完全相同的,只是前者的**更簡短。

OpenCV 畫素訪問

我說說我的理解 srcimage.at j,i 表示的是 j 行 i 列 的這個畫素 srcimage.at point j,i 表示的是 座標 j,i 的畫素12 為了 的圖方便說明 j 換成 x i 換成 y 也就是說 srcimage.at x,y 表示的是 x 行 y 列 的這個畫素 src...

OpenCV訪問畫素值操縱彙總

最通常的方法就是 cpp view plain copy img.at i,j 255 img.at i,j 0 255 如果你覺得at操作顯得太笨重了,不想用mat這個類,也可以考慮使用輕量級的mat 類,使用過載操作符 實現取元素的操作。cpp view plain copy cv mat im...

opencv2 (2)訪問畫素值

從根本上說,一張影象時乙個由數值組成的矩陣,這也是opencv2用cv mat這個資料結構來表示影象的原因。矩陣的每個元素代表乙個畫素,對於灰度影象,畫素有8為無符號數來表示,其中0代表黑色,255代表白色 對於彩色圖象,每個畫素需要三個這樣的8位無符號數來表示三個顏色通道 紅藍綠 此時矩陣的元素是...