1. 程式人生 > >影象的長寬以及灰度、RGB影象的畫素原理分佈

影象的長寬以及灰度、RGB影象的畫素原理分佈

今天在看矩形旋轉的時候忽然腦子短路,把一些概念全弄混了,現總結一下,以便下次再混的時候可以參考確認下,自己的理解,有錯的地方還請指正。

         首先,在Opencv2中基本上都是用的Mat來表示影象了,C++的函式呼叫中基本上也都是Mat圖,從根本上說,一張影象是一個由數值組成的矩陣,矩陣的每一個元素代表一個畫素。對於灰度影象而言,畫素有8位無符號數表示,其中0代表黑色,255代表白色。那麼矩陣和影象間到底是一個什麼樣的關係呢。

         第一:Mat圖有行和列,即cv::Mat中有公有成員變數cols和rows,注意,這裡的cols就是影象的寬度width,rows就是影象的高度height。這個width和height我們可以在其它

OpenCV的成員中得到,比如矩形Rect,而矩形Rect就是一個經常會用到的結構了,我自己接觸到的就包括滑鼠選擇矩形區域、框住目標的矩形區域、濾波器矩形模版、目標的矩形特徵、矩形內的運算等等。可以說Rect是一個非常常用的結構,也是Opencv裡非常有用的一個結構,本質上矩形區域就是影象的一個子部分,或者說影象矩陣的一個子矩陣。

         這裡我引用《OpenCV學習筆記(四十一)——再看基礎資料結構core》中關於Rect的介紹,Rect_類有些意思,成員變數x、y、width、height,分別為左上角點的座標和矩形的寬和高。常用的成員函式有Size()返回值為一個Size,area()

返回矩形的面積,contains(Point)用來判斷點是否在矩形內,inside(Rect)函式判斷矩形是否在該矩形內,tl()返回左上角點座標,br()返回右下角點座標。

         第二:Mat圖中的影象畫素位置表示和矩陣中元素的表示。這裡引用《訪問Mat影象中每個畫素的值》中幾張圖來表示Mat矩陣中存資料的關係。單通道灰度圖資料存放格式:

                                                                   

多通道的影象中,每列並列存放通道數量的子列,如RGB三通道彩色圖:

                                             

這時,大家得注意了,二維矩陣的行和列用來表示一個元素,並且一般是從0標號開始,所以實際上是有m+1列,也就是說寬度width是m+1的,行類似。還有就是Mat.at(int y, int x)來訪問一個畫素,這時候的y表示的行號,x表示的列號,相對應的就是x表示水平的寬,y表示的豎直的高,只不過x和y都是從0開始的標號。容易搞混的地方就在於一些矩陣的相減了,相減完後怎麼表示畫素位置,這個時候一般比較難把握,但是隻要明白矩陣裡x,y,width,height的關係,搞清楚就容易多了。