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