opencv學習筆記 二 操作畫素

2021-08-08 17:08:51 字數 4808 閱讀 1665

第二章: 操作畫素

2.1引言:

灰度影象畫素由8位無符號數來表示,0表示黑色,255表示白色。

彩色影象(rgb)畫素由三個8位的無符號數來表示,儲存方式為三元數(b,g,r)

2.2訪問畫素值

mat類有若干成員和成員函式來獲取影象的屬性:

成員cols和rows表示 寬和高(列和行)

成員函式 at《畫素型別名稱》(int i, int j)可以用來訪問畫素

image.at(i,j); //灰度影象的畫素,at後的資料型別一定要和image畫素資料型別吻合

image.at(i,j); //rgb影象的畫素 vec3b表示三個8位無符號整形組成的向量

image.at(i,j)[channel]; //畫素向量的第channel個元素

image.at(i,j)[1]; //第二個

image.at(i,j)[2]; //第三個

int mat::channels(); //用來獲得畫素的通道數

cv::mat_類可以更方便訪問畫素

cv::mat_image1=image; //用mat_類定義帶資料型別的影象資料,可以直接訪問畫素

image1(i,j) = 0;

2.3使用指標來遍歷影象

uchar *data = image.ptr(j); //獲取第i行的指標

data[i] = 0; //表示第i行,第j列元素值置0,而不是第i行第j列畫素置0(rgb影象每個畫素有三個元素)

顏色縮減函式:

#include #include #include using namespace cv;

using namespace std;

void colorreduce(mat &image, int div)}}

int main(int argc, char** argv)

image.step //表示行的位元組數image.element//表示畫素的位元組數顏色縮減:

div = pow(2,n);

uchar mask = 0xff《上個顏色縮減函式中,改變原影象資料,若不想修改原影象則可以用:image.copyto(image1);或者:void reducecolor(const mat &image, mat &result, int div)//檢查result和image大小資料型別是否一致

高效遍歷影象:

void colorreduce(mat &image, int div)

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

}}

底層指標運算:

void colorreduce(mat &image, int div)

}

常量迭代器:當前不會對mat類例項進行修改

mat constiterator_it ;

mat_::const_iterator;

2.5 編寫高效的影象遍歷迴圈

void colorreduce(mat &image, int div)

int n = static_cast(log(static_cast(div)) / log(2.0));//位運算效率高

uchar mask = 0xff << n;

for (int j = 0;j < n1;++j)

}}

2.6 遍歷影象和鄰域操作銳化濾波器灰度影象:

void sharpen(const mat &image, mat &output)

}output.row(0).setto(scalar(0));表示輸出的第0行,setto(scalar(0)),置為0

output.row(output.rows-1).setto(scalar(0));

output.col(0).setto(scalar(0));

output.col(output.cols-1).setto(scalar(0));

}

彩色影象:

void sharpen3d(const mat &image, mat &output)

}output.row(0).setto(scalar(0, 0, 0));表示輸出的第0行,setto(scalar(0)),置為0

output.row(output.rows-1).setto(scalar(0, 0, 0));

output.col(0).setto(scalar(0, 0, 0));

output.col(output.cols-1).setto(scalar(0, 0, 0));

}

filter2d濾波器首先定義mat核矩陣

#include //包含filter2d()函式

void sharpen2d(const mat &image, mat &output)

2.7進行簡單的影象算數

void addweighted(inputarray src1, double alpha, inputarray src2,

double beta, double gamma, outputarray dst, int dtype = -1);

dst = src1*alpha + scr*beta + gamma//(按輸入的原格式返回)

add(imagea, imageb, imagec); //imagec = imagea + imageb//(a和b的大小應該相同)

add(imagea, scalar(k), imagec); //imagec = imagea + k

scaleadd(imagea, k, imageb, imagec); //imagec = imagea*k +imageb

m1*m2 //矩陣乘法

m1.inv() //矩陣求逆

m1.t() //矩陣求轉置

2.8 定義感興趣的區域(roi)新增logo

imshow("picture原圖", image);

imshow("picture疊加", imageroi);

waitkey(0);

也可以通過影象掩膜完成定義roi的方法:

imageroi = image(rect(100, 100, 300, 300)); //選擇頂點(100,100)寬度和長度分別為300,300

imageroi = image(range(100, 400), range(100,400)); //roi與原始影象共享資料區

建立原始影象的特定行:

mat imageroi = image.rowrange(start, end);

mat imageroi = image.colrange(start, end);

opencv學習筆記(二)操作畫素

人類的視覺系統是三原色的,視網膜上有三種型別的視錐細胞,它們將顏色資訊傳遞給大腦。這意味著對於彩色影象,每個畫素都要對應三個數值。在攝影和數字成像技術中,常用的主顏色通道是紅色 綠色和藍色,因此每3個8位數值組成矩陣的乙個元素。為了說明如何直接訪問畫素值,我們建立乙個簡單的函式,用它在影象中加入椒鹽...

學習Opencv 2 4 9(二) 操作畫素

來自 本質上說一張影象就是由數值組成的矩陣。opencv 2.x由 cv mat 這個資料結構來表示一張影象。矩陣的每乙個元素代表了乙個畫素。對於彩色影象而言矩陣的元素是乙個三元數。對影象有了這個新的認識,下面可以試著借助opencv處理影象了。先來看一下今天要處理的影象 今天的主題是訪問畫素,首先...

opencv畫素操作

1 bit depth 位元數 代表8bite,16bites,32bites,64bites 舉個例子吧 比如說,如 如果你現在建立了乙個儲存 灰度的mat物件,這個影象的大小為寬100,高100,那麼,現在這張 灰度中有10000個畫素點,它每乙個畫素點在記憶體空間所佔的空間大小是8bite,8...