RV1126 NO.36:OPENCV的at函数遍历图像像素
一.OPENCV的AT函数定义:

AT函数是OPENCV中重要的函数之一,它的作用是修改Mat的矩阵某个像素值。换言之,我们需要修改图像中的像素点就需要利用AT函数去获取并且修改,AT函数的修改一般需要循环cols和rows然后对每个像素点进行修改,如上图。AT函数的定义如下:
at<typename>(int i, int j)第一个参数:typename指的是OPENCV的向量类型,向量类型如下:
typedef Vec<uchar, 2> Vec2b:uchar类型的数组,长度为2, 它表示的是二维图像的位置信息、尺寸等等
typedef Vec<uchar, 3> Vec3b:uchar类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是uchar类型
typedef Vec<uchar, 4> Vec4b:uchar类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是uchar类型typedef Vec<short, 2> Vec2s:short类型的数组,长度为2, 它表示的是二维图像的位置信息、尺寸等等,但不能做像素处理
typedef Vec<short, 3> Vec3s:short类型的数组,长度为3, 它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是short类型
typedef Vec<short, 4> Vec4s:short类型的数组,长度为4, 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是short类型typedef Vec<ushort, 2> Vec2w:ushort类型的数组,长度为2,它表示的是二维图像的位置信息、尺寸等等,但不能做像素处理
typedef Vec<ushort, 3> Vec3w:ushort类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是ushort类型
typedef Vec<ushort, 4> Vec4w:ushort类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是ushort类型typedef Vec<int, 2> Vec2i: int类型的数组,长度为2, 它表示的是一个包含2个整数的元素向量,并不能直接表示通道数
typedef Vec<int, 4> Vec4i: int类型的数组,长度为4, 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是int类型
typedef Vec<int, 6> Vec6i: int类型的数组,长度为6, 它常用于表示六维图像,包括:坐标、描述子、颜色直方等等,但是不能对六维图像直接进行处理
typedef Vec<int, 8> Vec8i: int类型的数组,长度为8, 它常用于表示八维图像,包括:坐标、描述子、颜色直方等等,但是不能对八维图像直接进行处理typedef Vec<float, 2> Vec2f:float类型的数组,长度为2,它表示的是二维图像的位置信息,但不能做通道处理
typedef Vec<float, 3> Vec3f:float类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是浮点数
typedef Vec<float, 4> Vec4f:float类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是浮点数
typedef Vec<float, 6> Vec6f: float类型的数组,长度为4,他用于处理6个维度的图像数据,需要注意的是Vec6f仅仅能表示具有6个维度的数据,并不可以对数据进行操作.typedef Vec<double, 2> Vec2d:double类型的数组,长度为2,在图像处理中Vec2d仅仅只是表示具有double类型的图像数据,但是并不能直接操作数据像素
typedef Vec<double, 3> Vec3d:double类型的数组,长度为3,它常用于表示图像的彩色三通道,分别是R(红色)、G(绿色)、B(蓝色),并且对于这三个通道的像素值进行double类型数据的处理typedef Vec<double, 4> Vec4d:double类型的数组,长度为4,它常用于表示图像的彩色四通道,分别是A(透明度)、R(红色)、G(绿色)、B(蓝色),并且对于这四个通道的像素值进行double类型数据的处理。需要注意的是:一般OPENCV对像素的处理大部分都是用uchar类型,其他类型用的很少。第二个参数:i,指的是rows,图像的行数据
第三个参数:j,指的是cols,图像的列数据二.代码实现at函数遍历Mat矩阵的像素点,并修改像素
2.1 本章节代码主要实现通过at函数遍历Mat矩阵的列和行,并修改三通道图像的像素值。(如图一),大概的代码如下:

Mat img_mat = imread("frame1.jpg"); //读取图片
for (int i = 0; i < img_mat.rows; i++) //循环遍历rows
{for (int j = 0; j < img_mat.cols; j++) //循环遍历cols{img_mat.at<Vec3b>(i,j)[0] = (int)img_mat.at<Vec3b>(i,j)[0] - 10; //对第一个通道进行像素处理img_mat.at<Vec3b>(i,j)[1] = (int)img_mat.at<Vec3b>(i,j)[1] - 50; //对第二个通道进行像素处理img_mat.at<Vec3b>(i,j)[2] = (int)img_mat.at<Vec3b>(i,j)[2] - 10; //对第三个通道进行像素处理}}
imwrite("frame1_process.jpg", img_mat);上面代码就是对图像的三个通道进行处理,第一个通道的数值 - 10,第二个通道的数值 - 50,第三个通道的数值 - 10。经过处理后的图像如下
原图:

处理过后:

2.2. 本章节代码主要是实现对一个Mat矩阵用at函数去遍历cols和rows,并修改单通道像素,大概的代码如下:

//single channels Mat before_process_gray_Image;Mat process_gray_Image;//用于存储转换后的灰度图像cvtColor(mat, before_process_gray_Image, COLOR_RGB2GRAY); //RGB图像转换成GRAY灰度,保存没有进行操作的灰度图cvtColor(mat, process_gray_Image, COLOR_RGB2GRAY); //RGB图像转换成GRAY灰度,保存进行操作的灰度图for (int i = 0; i < process_gray_Image.rows; i++){for (int j = 0; j < process_gray_Image.cols; j++){process_gray_Image.at<uchar>(i,j) = 50 - process_gray_Image.at<uchar>(i,j); //对灰度像素进行相减操作}}imwrite("gray_frame1.jpg", before_process_gray_Image);imwrite("gray_frame1_process.jpg", process_gray_Image);
上面代码就是对图像的单个通道进行处理,对单个通道的像素进行处理,这里的像素-50,处理后的效果如下:
没有经过像素处理的灰度jpg图片:

经过灰度处理的图片:

