6、像素值的读写方式有哪些?(列出两种以上)

七月在线里面的回答太简单了。。。

于是我就在此基础上对其三种方法进行一下解释吧。。。

1 at方式循环遍历

OpenCV提供 imread 和 imwrite 函数读写图像,对于像素的读写可以通过 at 的方式,

  • 读写一个灰度图像像素点的像素值
// y代表行,x代表列
// 取出灰度图像中y行x列的点
Scalar intensity = Mat.at<uchar>(y,x)
// 或者
Scalar intensity = Mat.at<uchar>(Point(x,y))
  • 读写一个彩色图像像素点的像素值
// 取出彩色图像中y行x列第k通道的颜色点
Mat.at<Vec3b>(y,x)[k]

int b = img.at<Vec3b>(row, col)[0];
int g = img.at<Vec3b>(row, col)[1];
int r = img.at<Vec3b>(row, col)[2];

// 或者

float b = img.at<Vec3f>(row, col)[0];
float g = img.at<Vec3f>(row, col)[1];
float r = img.at<Vec3f>(row, col)[2];

// 写像素

Mat dst;
dst.at<Vec3b>(row, col)[0] = 20;
dst.at<Vec3b>(row, col)[1] = 13;
dst.at<Vec3b>(row, col)[2] = 14;

2 指针的方式

// 用指针.ptr(k)来遍历图像
// 获取像素矩阵的指针,索引i表示第几行,从0开始计数
Mat.ptr<uchar>(int i=0)
// 获取当前行指针
const uchar* current = Mat.ptr<uchar>(row);
// 获取当前像素点P(row,col)的像素值
P(row,col) = current[col]

3 Mat迭代器循环遍历

参考这篇

Mat image ( 80, 60, CV_8UC3 );
MatIterator_<Vec3b>color = image.begin<Vec3b>();
MatIterator_<Vec3b>color2 = image.end<Vec3b>();

上面演示实例化了2个对象,一个是color,另一个是color2;
在初始化的时候显式的给2个对象赋了值;
赋值形式比较奇怪(image.begin()),在begin函数后面加入了类型说明,因为begin()函数返回的是MatIterator_模板对象,所以在实例化的时候要加上

你可能感兴趣的:(七月在线CV面试题,opencv,计算机视觉)