像素值的读写 OpenCV的at()函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_36503007/article/details/79895610