opencv2 (2)訪問畫素值

2021-07-25 18:11:24 字數 1676 閱讀 1895

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

為了訪問矩陣元素,你需要在**中指定元素所在的行和列。程式會返回相應的元素。如果影象是單通道的,返回值是單個數值;如果影象時多通道的,返回值怎是一組向量(vector)。

我們通過乙個簡單的函式倆演示直接訪問畫素值,該函式會在影象中加入鹽噪點(隨機的部分畫素設定為白色或黑色),即模擬畫素值丟失的情況。

一、**

#include

#include

#include

using

namespace

std;

using

namespace

cv;void

salt(

mat& image

, int

n )else

if (

image

.channels() == 3) }}

int main(

intargc

, char

** argv

)salt(srcimage, 3000);

namedwindow(

"image"

);imshow(

"image"

, srcimage);

waitkey(0);

return

0;}

二、分析

類cv::mat有若干成員函式可以獲取影象屬性。公有成員變數 cols 和 rows 給出了影象的寬和高。成員函式 at( int y, int x) 可以用來存放影象元素。但必須在編譯期間知道影象的資料型別,因為 cv::mat 可以存放任意的資料型別的元素。這也是這個函式用模板函式來實現的原因。這也意味著,當呼叫該函式時,你需要使用以下方式指定資料型別:

image.at(j,i)=255;

指定的資料型別一定和矩陣中的資料型別相符合。at方法本身不會進行任何資料型別轉換。

對於彩色影象,每個畫素有三個通道,乙個包含彩色影象的cv::mat 會返回三個8位數組成的向量。opencv將此向量定義為cv::vec3b,即由三個unsigned char組成的向量,所以訪問彩色影象畫素的**寫成以下形式:

image

.atvec3b

>(j, i)

[channel

]= value ;

三、擴充套件

cv::mat 成員函式有時候比較麻煩,因為返回值的型別必須通過在呼叫時通過模板引數指定。因此,opencv提供了類cv::mat_ ,它是cv::mat的乙個字類,此類的指標或引用可以直接進行相互型別轉換。該類過載了操作符():

cv::mat_ im2=image; //im2指向image

im2(50,100)=0 ; //訪問第50行,100列

四、測試結果

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

為構建計算機視覺應用程式,我們需要學會訪問影象的內容,有時也要修改或者建立影象。本章將講講如何操作影象的元素 即畫素 影象本質上就是由陣列組成的矩陣。opencv使用了cv mat結構來操作影象。矩陣中的每乙個元素表示乙個畫素。對灰度影象而言,畫素是8位無符號數 資料型別為unsigned char...

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...

OpenCV 2 2 的學習筆記(二)

1 獲取影象的大小 image.size width 與 image.size height 就是影象的寬與高。2 檢查影象中的資訊 if image.data error occurred 3 反轉影象內容 cv flip image,result,1 其中result也是cv mat型別的。最後...