第二章: 操作畫素
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...