OpenCV学习笔记:像素级访问的两种方法

前言
当使用OpenCV对图像进行处理时,了解如何独立地访问每个像素是十分必要的。本文会介绍两种方法:第一种方法对程序员来说较为简单,而第二种方法在某种特定情况下效率会更高。

1.模板函数at<>

实例:

//第一种情况
Mat src1 = imread("lena.jpg",IMREAD_GRAYSCALE);
unchar pixel1 = src1.at<uchar>(0,0);
cout << "Value of pixel (0,0):" << (unsigned int)pixel1 << endl;//
//第二种情况
Mat src2 = imread(lena.jpg",IMREAD_COLOR)
Vec3b pixel2 = src2.at<Vec3b>(0,0);
cout << "B component of pixel (0,0):" << (unsigned int)pixel2[0] <<endl;

讲解:
上述例子使用灰度和彩色两种方式读取同一幅图像,并访问图像的第一个像素。
在第一种情况中,图像以灰度方式读取,像素类型是无符号字符(即uchar);
在第二种情况下,图像以全色方式读取,必须使用Vect3b类型,它指向一个无符号字符的三元组。

注意:使用模板函数at<>必须指定矩阵单元的类型。

除此之外,模板函数还可以出现在赋值符号的左侧,即改变一个像素的值。实例如下:

Mat M(200,200,CV_64F);
for(int i = 0;i < M.rows;i++)
   for(int j = 0;j < M.cols;j++)
      M.at<double>(i,j) = CV_PI;   //将浮点矩阵初始化为Pi值

2.函数ptr

实例:

uchar R,G,B;
for(int i = 0;i<src2.rows;i++)
{
   Vec3b* pixrow = src2.ptr<Vec3b>(i);  //函数ptr的返回值是指向图像特定行的一个指针。
   for(int j = 0;j < src2.cols;j++)
   {
     B = pixrow[j][0];
     G = pixrow[j][1];
     R = pixrow[j][2];
    }
}

讲解:
上述例子获取一幅彩色图像中每个像素的像素值。
其中,ptr用来得到一个指向每行在第一个像素的指针,然后使用这个指针可以在内层循环中实现访问每一列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉闫小亘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值