在学习OpenCV进行图像处理的过程中,常常会用到对指定位置像素的读取和修改,
最常用的就是cv::MAT.at<>()和cv::MAT.ptr<>(),下面我们就介绍OpenCV中这两种常用的对指定位置像素值的读取和修改操作。
一、at操作
at操作是一种直接简单的对单个像素的操作方式,用于获取图像矩阵某点的值或改变某点的值
对于灰度图读取和修改操作如下:
uchar srcPixel_value = cv::Mat.at<uchar>(row, col);
cv::Mat.at<uchar>(row, col) = srcPixel_value ;
对于RGB彩色图像而言:
cv::Vec3b rgb_value = cv::Mat.at<cv::Vec3b>(row, col);
cv::Mat.at<cv::Vec3b>(row, col) = rgb_value ;
或者:
image.at<cv::Vec3b>(row, col)[0] = 255;
image.at<cv::Vec3b>(row, col)[1] = 255;
image.at<cv::Vec3b>(row, col)[2] = 255;
例子:
cv::Mat image(3,10,CV_32FC3);
int div = 4;
for(int i=0; i<image.rows;i++)
{
for(int j=0; j<image.cols; j++)
{
image.at<Vec3f>(i,j)[0]=image.at<Vec3f>(i.j)[0] / div;
image.at<Vec3f>(i,j)[1]=image.at<Vec3f>(i.j)[1] / div;
image.at<Vec3f>(i,j)[2]=image.at<Vec3f>(i.j)[2] / div;
}
};
at操作虽然简单方便,但是这种操作是一种效率比较低的操作,尤其用其进行遍历操作时,效率会很低。因此一般不推荐使用。
二、ptr操作:
ptr操作时通过指针偏移的方式进行像素的查找、遍历和修改的,因此效率相对较高。
ptr<>()是按照行来访问数组的,指针指向某一行第一个元素的首地址。只要知道这一行的首地址,其余地址++就可以访问了。
对于灰度图的读取和修改操作如下:
uchar srcPixel_value = cv::Mat.ptr<uchar>(row)[col];
cv::Mat.ptr<uchar>(row)[col] = srcPixel_value ;
对于RGB彩色图像而言:
cv::Vec3b rgb_value = Mat.ptr<cv::Vec3b>(row)[col];
cv::Mat.ptr<cv::Vec3b>(row)[col] = rgb_value ;
例子:
cv::Mat image (3,10,float);
int div = 4;
cv::Mat newimage(image.size(), image.type());
for(int i=0; i<image.rows; i++)
{
uchar *data=image.ptr<uchar>(i);
uchar *outdata=newimage.ptr<uchar>(i);
for(int j=0; j<image.cols; j++)
{
outdata[ j ]= data[ j ] /div;
}
};
cv::MAT.ptr<>()访问效率比较高,程序也比较安全,有越界判断。推荐使用。