人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

詳解OpenCV圖像的概念和基本操作

發(fā)布日期:2021-12-27 12:05 | 文章來源:腳本之家


opencv最主要的的功能是用于圖像處理,所以圖像的概念貫穿了整個opencv,與其相關(guān)的核心類就是Mat。

像素:

圖片尺寸以像素為單位時,每一厘米等于28像素,如1515厘米長度的圖片,等于420420像素的長度。一個像素所能表達的不同顏色數(shù)取決于比特每像素(BPP)。

灰度圖像:8bpp=2的8次方=256色,
高彩色:16bpp=2的16次方=65536色,
真彩色:24bpps=2的24次方=16777216色。

圖像分辨率:

圖像分辨率是圖像總像素的多少,由于圖像通常用矩陣表示,所以分辨率常用,mn表示,注意: n 表示行數(shù)(代表一列包含的像素),m表示列數(shù)代表一行包含的像素。

640X480表示圖像的長和寬分別為640和480,總像素為640X480=307200(相機中所說的30萬分辨率),
800X600表示圖像的長和寬分別為800和600,總像素為800X600=480000(相機中所說的50萬分辨率)。

圖像和矩陣

圖像是由像素組成的,而像素實際上就是帶有坐標位置和顏色信息的點。我們把圖片想象成由若干行,若干列的點組成的, 現(xiàn)實中有RGB顏色系統(tǒng),我們可以把圖中任意一點(位置在第m行,第n列)的點A表示為

A[m,n] = [blue,green,red]
參數(shù)解讀
m |A點在圖像中的第m行
n |A點在圖像中的第n列
blue |表示藍色,三原色(RGB)的第一個數(shù)值
green|表示綠色,三原色(RGB)的第二個數(shù)值
red |表示紅色,三原色(RGB)的第一個數(shù)值

每個點對應(yīng)的亮度可以理解為rgb的值,無符號8位數(shù)3維,則一個像素點為3維數(shù)組,分別對應(yīng)RGB的值,在OpenCV中數(shù)據(jù)類型為:cV_8u3C。
假設(shè)Mx N,lij表示第j行j列,對應(yīng)上圖就是M= 300,N= 200。
假設(shè)Mx N,lij表示第j行j列,對應(yīng)上圖就是M= 300,N= 200。

注意:在Opencv中三維數(shù)組存儲RGB值,存儲顏色通道的順序不是RGB,而是BGR,如下圖:

Mat排列方式如下:

像素值的讀寫

很多時候,我們需要讀取某個像素值,或者設(shè)置某個像素值;在更多的時候,我們需要對整個圖像里的所有像素進行遍歷。OpenCV提供了多種方法來實現(xiàn)圖像的遍歷。
方法一:at 函數(shù)

  cv::Mat grayim(600, 800, CV_8UC1);
 // 遍歷所有像素,并設(shè)置像素值
 for( int i = 0; i < grayim.rows; ++i)
 {
  for( int j = 0; j < grayim.cols; ++j )
  {
 grayim.at<uchar>(i,j) = (i+j)%255;
  }
 }
imshow("grayim",grayim);
 cv::Mat colorim(600, 800, CV_8UC3);
 // 遍歷所有像素,并設(shè)置像素值
 for( int i = 0; i < colorim.rows; ++i)
 {
  for( int j = 0; j < colorim.cols; ++j )
  {
cv::Vec3b pixel;
// 注意:opencv通道順序,BGR,非RGB
pixel[0] = i%255;  // Blue
pixel[1] = j%255;  // Green
pixel[2] = 0;// Red
colorim.at<Vec3b>(i,j) = pixel;
  }
 }
 imshow("colorim",colorim);
 waitKey();

方法一:使用數(shù)據(jù)指針

 cv::Mat grayim(600, 800, CV_8UC1);
 cv::Mat colorim(600, 800, CV_8UC3);
 //遍歷所有像素,并設(shè)置像素值
 for( int i = 0; i < grayim.rows; ++i)
 {
  //獲取第 i 行首像素指針
  uchar * p = grayim.ptr<uchar>(i);
  //對第 i 行的每個像素(byte)操作
  for( int j = 0; j < grayim.cols; ++j )
  p[j] = (i+j)%255;
 }
 //遍歷所有像素,并設(shè)置像素值
 for( int i = 0; i < colorim.rows; ++i)
 {
  //獲取第 i 行首像素指針
  cv::Vec3b * p = colorim.ptr<cv::Vec3b>(i);
  for( int j = 0; j < colorim.cols; ++j )
  {
p[j][0] = i%255; //Blue
p[j][1] = j%255; //Green
p[j][2] = 0;  //Red
  }
 }
 imshow("grayim",grayim);
  imshow("colorim",colorim);

實驗效果

圖像局部操作

選擇單行/單列
示例:A矩陣的第i行,將這一行的所有元素都乘以2,然后賦值給第j行

A.row(j)= A.row(i)*2;

選擇多行/多列
Range是OpencV中新增的類,該類有兩個關(guān)鍵變量star和end。Range對象可以用來表示矩陣的多個連續(xù)的行或者多個連續(xù)的列。其表示的范圍為從start到end,包含start。

// 創(chuàng)建一個單位陣
Mat A = Mat::eye(10, 10, CV_32S);
// 提取第 1 到 3 列(不包括 3)
Mat B = A(Range::all(), Range(1, 3));
// 提取B的第 5 至 9 行(不包括 9)
// 其實等價于C = A(Range(5, 9), Range(1, 3))
Mat C = B(Range(5, 9), Range::all());

選擇指定區(qū)域

圖像中提取感興趣區(qū)域(Region of interest)有兩種方法:
方法—:使用構(gòu)造函數(shù)

//創(chuàng)建寬度為 320,高度為 240 的 3 通道圖像
Mat img(Size(320, 240), CV_8UC3);
//roi 是表示 img 中 Rect(10, 10, 100, 100)區(qū)域的對象
Mat roi(img, Rect(10, 10, 100, 100));

方法二:使用括號運算符

Mat roi2 = img(Rect(10, 10, 100, 100));
//當然也可以使用Range對象來定義感興趣區(qū)域,如下:
// 用括號運算符
Mat roi3 = img(Range(10, 100), Range(10, 100)); 
// 用構(gòu)造函數(shù)
Mat roi4(img, Range(10, 100), Range(10, 100));

取對角線元素

矩陣的對角線元素可以使用cv::Mat就的diag()函數(shù)獲取:

Mat Mat::diag(int d) const

1.當d=0時,表示取主對角線; 當參數(shù)d>0是,表示取主對角線下方的次對線,
2. 當d=1時,表示取主對角線下方,且緊貼主多角線的元素;
3. 當參數(shù)d<0時,示取主對角線上方的次對角線。如同row()和col)函數(shù),diag()函數(shù)也不進行內(nèi)存復制操作,其復雜度也是0(1)。

到此這篇關(guān)于OpenCV圖像的概念和基本操作的文章就介紹到這了,更多相關(guān)OpenCV圖像基本操作內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部