目录
图像处理中经常会使用到OpenCV,需要遍历图像的像素值,下面介绍几种OpenCV中图像像素访问的方法。案例中,用RGB转灰度当作实例。
一、直接下标M.at<>(i,j)方法。
void Color2Gray(Mat bgrImg, unsigned char *dataY)
{
int row = bgrImg.rows;
int col = bgrImg.cols;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
int valB = bgrImg.at<Vec3b>(i, j)[0];
int valG = bgrImg.at<Vec3b>(i, j)[1];
int valR = bgrImg.at<Vec3b>(i, j)[2];
int gray = valR * 0.299 + valG * 0.587 + valB * 0.114;
dataY[i * col + j] = gray;
}
}
}
二、通过M.ptr<unsigned char>(j)方法。
void Color2Gray(Mat bgrImg, unsigned char *dataY)
{
int row = bgrImg.rows;
int col = bgrImg.cols;
for (int i = 0; i < row; i++) {
unsigned char *data = bgrImg.ptr<unsigned char>(i);
for (int j = 0; j < col; j++) {
int valB = data[3 * j + 0];
int valG = data[3 * j + 1];
int valR = data[3 * j + 2];
int gray = valR * 0.299 + valG * 0.587 + valB * 0.114;
dataY[i * col + j] = gray;
}
}
}
或者
void Color2Gray(Mat bgrImg, unsigned char *dataY)
{
int row = bgrImg.rows;
int col = bgrImg.cols;
for (int i = 0; i < row; i++) {
Point3_<unsigned char> *data = bgrImg.ptr<Point3_<unsigned char>>(i);
for (int j = 0; j < col; j++) {
int valB = data[j].x;
int valG = data[j].y;
int valR = data[j].z;
int gray = valR * 0.299 + valG * 0.587 + valB * 0.114;
dataY[i * col + j] = gray;
}
}
}
三、迭代器方法
void Color2Gray(Mat bgrImg, unsigned char *dataY)
{
Mat_<Vec3b>::iterator it = bgrImg.begin<Vec3b>();
Mat_<Vec3b>::iterator itend = bgrImg.end<Vec3b>();
int ind = 0;
while (it != itend)
{
int valB = (*it)[0];
int valG = (*it)[1];
int valR = (*it)[2];
int gray = valR * 0.299 + valG * 0.587 + valB * 0.114;
dataY[ind] = gray;
it++;
ind++;
}
}