版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36503007/article/details/79895610
图像处理中很多时候会对像素点进行操作。在OpenCV有许多方法来对像素进行遍历,这篇是对at()函数做的笔记。
at()函数
对于单通道图像"picture1",picture1.at<uchar>(i,j)就表示在第i行第j列的像素值。对于多通道图像如RGB图像"picture2",可以用picture2.at<Vec3b>(i,j)[c]来表示某个通道中在(i,j)位置的像素值。
1)上面的uchar、Vec3b表示图像元素的类型。
2)(i,j)当然就是指像素点的位置,表示第i行第j列。
3)[c]表示的是通道,对于RGB图像而言,c取0就是B分量;c取1就是G分量;c取2就是R分量(要注意在OpenCV中是按BGR的顺序表示的)。
代码(单通道图像遍历):
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
Mat picture(200, 200, CV_8UC1);/*创建图像picture,默认为纯黑色(即每个点的像素值为0),
大小为200 * 200,类型为CV_8UC1(是单通道图像)*/
imshow("picture", picture); //在“picture”窗口显示图像picture
//遍历picture的每个像素点,并将所有像素点的值修改为150
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
picture.at<uchar>(i, j) = 150;
}
imshow("dst", picture);//在“dst”窗口显示修改后的图像picture
waitKey(0);//等待用户按键
return 0;
}
运行结果
下面也给出彩色图像遍历的示例:
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
Mat picture(200, 200, CV_8UC3);//新建一个三通道彩色图像,初始默认为纯黑色
imshow("picture", picture);
//遍历picture的每个像素点,并将每个通道所有像素点的值修改为0~255中随机一个整数值
for (int i = 0; i < 200; i++)
{
for (int j = 0; j < 200; j++)
{
picture.at<Vec3b>(i, j)[0] = rand() % 255;//B通道
picture.at<Vec3b>(i, j)[1] = rand() % 255;//G通道
picture.at<Vec3b>(i, j)[2] = rand() % 255;//R通道
}
}
imshow("dst", picture);
waitKey(0);
return 0;
}