從根本上說,一張影象時乙個由數值組成的矩陣,這也是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型別的。最後...