opencv3.0操作像素方法

opencv3.0操作像素方法:

  1. 行指针遍历:c操作符[]
  2. 迭代器遍历:iterator
  3. 动态地址计算遍历

1.行指针遍历:

Mat类提供了若干成员函数可以获取图像的属性,公有成员变量cols和rows给出图像的宽和高,成员函数channels()返回图像的通道数(灰度图像为1,彩色RGB图像则为3),ptr函数可以得到图像任意行的首地址。

第i行的首地址:
uchar* data=outputImage.ptr<uchar>(i);
每行像素值通过下面语句获得:
int colNumber=outputImage.cols*outputImage.channels();

2.迭代器遍历:

此方法用迭代器操作像素,与STL库的用法类似。在迭代法中,仅仅需要获得图像矩阵的begin和end,然后增加迭代从begin到end。将星号操作符添加在迭代指针前,即可以访问当前指向的内容。相比于指针直接访问可能出现越界问题,迭代器绝对是非常安全的方法。

Mat_<Vec3b>::iterator it=outputImage.begin<Vec3b>();
Mat_<Vec3b>::iterator itend=outputImage.end<Vec3b>();
for(;it!=itend1;++it)
{
//对像素进行处理
(*itBegin1)[0]= ;
(*itBegin1)[1]= ;
(*itBegin1)[2]= ;
++it;
}

3.at函数方法遍历:

成员函数at(int y, int x)可以用来存取图像元素,但是必须在编译期知道图像的数据类型。对于彩色图像,每个像素由三个部分构成:蓝色通道、绿色通道和红色通道(BGR)。因此,对于一个包含彩色图像的Mat,会返回一个由三个8位数组成的向量。 Opencv将此类型的向量定义为Vec3b,即由三个unsigned char组成的向量。

int rows=originalImage.rows;
int cols=originalImage.cols;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
//若是灰度图像应使用如下表示
//outputImage.at<uchar>(i,j)= ;
//对像素进行处理
outputImage.at<Vec3b>(i,j)[0]= ;
outputImage.at<Vec3b>(i,j)[1]= ;
outputImage.at<Vec3b>(i,j)[2]= ;
}
}

备注:

  • OpenCV中坐标体系中的零点坐标定义为图片的左上角,X轴为图像矩形的上面那条水平线,从左往右;Y轴为图像矩形左边的那条垂直线,从上往下。在Point(x,y)和Rect(x,y)中,第一个参数x代表的是元素所在图像的列数,第二个参数y代表的是元素所在图像的行数,而在at(x,y)中是相反的。

  • “指针方法”是一种可以高效遍历图像的方式,但是只能针对没有经过填充的连续图像,所以在使用指针方法之前需要先判断图像有没有经过填充,是否连续性。判断的方法很简单,使用Mat的成员函数isContinuous来判断,若返回值为真的话,说明图像是连续的, 可以应用行指针的方法遍历像素。

Reference:

《OpenCV3编程入门》
Opencv中三种操作像素的方法

-------------本文结束感谢您的阅读-------------