方式一:存取像素值。
如果想要获取指定坐标像素的值,可以采用Mat的成员函数at(j,i)来获取坐标()处的像素值。试例代码如下:
-
//用Mat的成员函数访问图像数据
-
if (image.channels()==
1)
-
{
-
image.at<uchar>(j,i)=
255;
-
}
-
else
if (image.channels() ==
3)
-
{
-
image.at<cv::Vec3b>(j,i)[
0] =
255;
//blue
-
image.at<cv::Vec3b>(j,i)[
1] =
255;
//green
-
image.at<cv::Vec3b>(j,i)[
2] =
255;
//red
-
}
用这种方式还可以给Mat矩阵矩阵赋初值:
-
cv::
Mat kernel(3,3,CV_32F,cv::Scalar(0));
-
kernel.at<
float>(
1,
1) =
5.0;
-
kernel.at<
float>(
0,
1) =
-1.0;
-
kernel.at<
float>(
2,
1) =
-1.0;
-
kernel.at<
float>(
1,
0) =
-1.0;
-
kernel.at<
float>(
1,
2) =
-1.0;
这种方式比较耗时,一般用来对随机位置的像素进行读写,并不适合用来遍历图像。下面介绍一种比较常用的遍历图像的方式:
方式二:使用指针遍历图像
-
int nl = image.rows;
//height
-
int nc = image.cols*image.channels();
-
for (
int j=
0; j<nl; j++)
-
{
-
uchar* data = image.ptr<uchar>(j);
//获取第j行数据的指针
-
for(
int i=
0; i<nc; i++)
-
{
-
-
}
-
}
其中Mat的类成员函数ptr(j)是获取图像指定行数据的指针。接下来还介绍一种使用迭代器遍历图像的方式:
方式三:使用迭代器遍历图像
-
cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
//得到初始位置的迭代器
-
cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
//得到终止位置的迭代器
-
for (; it!=itend; ++it)
-
{
-
(*it)[
0] = (*it)[
0]/div*div+div/
2;
//分别对各个通道进行数据处理
-
(*it)[
1] = (*it)[
1]/div*div+div/
2;
-
(*it)[
2] = (*it)[
2]/div*div+div/
2;
-
}
使用迭代器遍历图像数据也比较慢,它的主要目的是简化图像遍历的过程从而降低出错的机会。