Opencv中三种操作像素的方法
測試環(huán)境:opencv3.1.0 + Visual Studio 2015 + win7 64位
?
opencv中有3中方法可以訪問/修改圖像的像素值,分別為:
1.??????指針訪問
2.??????迭代器iterator
3.??????動態(tài)地址計(jì)算
?
測試程序如下:
運(yùn)行結(jié)果如下:
Debug模式下運(yùn)行時(shí)間如下:
Release模式下運(yùn)行時(shí)間如下:
可以看到指針操作在Debug模式和Release模式下均是最快的,動態(tài)地址和迭代器操作稍微慢點(diǎn)。
?
一些說明:
1.??????RGB顏色模型的矩陣如下(opencv中通道順序?yàn)锽GR):
因此,指針操作的時(shí)候,每行的元素個(gè)數(shù)為:列數(shù)x通道數(shù)。
Mat類提供了ptr函數(shù)可以得到圖像任意行的首地址。
?
2.??????在迭代法中,我們所需要做的僅僅是獲得圖像矩陣的begin和end,然后迭代從begin到end。將*操作符添加在迭代指針前,即可以訪問當(dāng)前指向的內(nèi)容。相比于指針直接訪問可能出現(xiàn)越界問題,迭代器絕對是非常安全的方法。
3.??????成員函數(shù)at(int y, int x)可以用來存取圖像元素,但是必須在編譯期知道圖像的數(shù)據(jù)類型。對于彩色圖像,每個(gè)像素由三個(gè)部分構(gòu)成:藍(lán)色通道、綠色通道和紅色通道(BGR)。因此,對于一個(gè)包含彩色圖像的Mat,會返回一個(gè)由三個(gè)8位數(shù)組成的向量。Opencv將此類型的向量定義為Vec3b,即由三個(gè)unsigned char組成的向量。這也解釋了為什么存取彩色圖像像素的代碼可以寫出如下形式
image.at<Vec3b>(j, i)[channel] = value;另外:
而對于單通道的灰度圖像就簡單很多了:
image.at<uchar>(i,j);?
這里要注意at中(i,j)的順序表示的是第i行第j列,跟Point(i,j)和Rect(i,j)中表示第j行第i列是相反的,如果把這個(gè)搞混了,很容易導(dǎo)致內(nèi)存異常,還不容易發(fā)現(xiàn)錯(cuò)誤。
?
補(bǔ)充說明一下:OpenCV中坐標(biāo)體系中的零點(diǎn)坐標(biāo)定義為圖片的左上角,X軸為圖像矩形的上面那條水平線,從左往右;Y軸為圖像矩形左邊的那條垂直線,從上往下。在Point(x,y)和Rect(x,y)中,第一個(gè)參數(shù)x代表的是元素所在圖像的列數(shù),第二個(gè)參數(shù)y代表的是元素所在圖像的行數(shù),而在at(x,y)中是相反的。
參考文獻(xiàn)
OpenCV3編程入門
OpenCV坐標(biāo)系與操作像素的四種方法
總結(jié)
以上是生活随笔為你收集整理的Opencv中三种操作像素的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV—中值滤波
- 下一篇: Slax Linux安装——备忘篇