OPENCV——at函数遍历图像像素

OPENCV——at函数遍历图像像素
一、AT函数定义AT函数是OPENCV中重要的函数之一它的作用是修改Mat的矩阵某个像素值。换言之我们需要修改图像中的像素点就需要利用AT函数去获取并且修改AT函数的修改一般需要循环cols和rows然后对每个像素点进行修改如上图。AT函数的定义如下attypename(int i, int j)第一个参数typename指的是OPENCV的向量类型向量类型如下typedef Vecuchar, 2 Vec2buchar类型的数组长度为2 它表示的是二维图像的位置信息、尺寸等等typedef Vecuchar, 3 Vec3buchar类型的数组长度为3它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是uchar类型typedef Vecuchar, 4 Vec4buchar类型的数组长度为4它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是uchar类型typedef Vecshort, 2 Vec2sshort类型的数组长度为2 它表示的是二维图像的位置信息、尺寸等等但不能做像素处理typedef Vecshort, 3 Vec3sshort类型的数组长度为3 它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是short类型typedef Vecshort, 4 Vec4sshort类型的数组长度为4 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是short类型typedef Vecushort, 2 Vec2wushort类型的数组长度为2它表示的是二维图像的位置信息、尺寸等等但不能做像素处理typedef Vecushort, 3 Vec3wushort类型的数组长度为3它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是ushort类型typedef Vecushort, 4 Vec4wushort类型的数组长度为4它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是ushort类型typedef Vecint, 2 Vec2i:int类型的数组长度为2 它表示的是一个包含2个整数的元素向量并不能直接表示通道数typedef Vecint, 4 Vec4i:int类型的数组长度为4 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是int类型typedef Vecint, 6 Vec6i:int类型的数组长度为6 它常用于表示六维图像包括坐标、描述子、颜色直方等等但是不能对六维图像直接进行处理typedef Vecint, 8 Vec8i:int类型的数组长度为8 它常用于表示八维图像包括坐标、描述子、颜色直方等等但是不能对八维图像直接进行处理typedef Vecfloat, 2 Vec2ffloat类型的数组长度为2它表示的是二维图像的位置信息但不能做通道处理typedef Vecfloat, 3 Vec3ffloat类型的数组长度为3它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是浮点数typedef Vecfloat, 4 Vec4ffloat类型的数组长度为4它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是浮点数typedef Vecfloat, 6 Vec6f:float类型的数组长度为4他用于处理6个维度的图像数据需要注意的是Vec6f仅仅能表示具有6个维度的数据并不可以对数据进行操作.typedef Vecdouble, 2 Vec2ddouble类型的数组长度为2在图像处理中Vec2d仅仅只是表示具有double类型的图像数据但是并不能直接操作数据像素typedef Vecdouble, 3 Vec3ddouble类型的数组长度为3它常用于表示图像的彩色三通道分别是R(红色)、G(绿色)、B(蓝色)并且对于这三个通道的像素值进行double类型数据的处理typedef Vecdouble, 4 Vec4ddouble类型的数组长度为4它常用于表示图像的彩色四通道分别是A(透明度)、R(红色)、G(绿色)、B(蓝色)并且对于这四个通道的像素值进行double类型数据的处理。需要注意的是一般OPENCV对像素的处理大部分都是用uchar类型其他类型用的很少。第二个参数i指的是rows图像的行数据第三个参数j指的是cols图像的列数据二、代码实现at函数遍历Mat矩阵的像素点并修改像素#include opencv2/opencv.hpp #include opencv2/dnn.hpp #include opencv2/imgcodecs.hpp #include opencv2/imgproc.hpp #include iostream using namespace std; using namespace cv; int main() { Mat mat imread(frame1.jpg); for(int i 0;i mat.rows; i) { for(int j 0;j mat.cols; j) { mat.atVec3b(i,j)[0] (int)mat.atVec3b(i,j)[0] - 10; //对第一个通道进行像素处理 mat.atVec3b(i,j)[1] (int)mat.atVec3b(i,j)[1] - 50; //对第二个通道进行像素处理 mat.atVec3b(i,j)[2] (int)mat.atVec3b(i,j)[2] - 10; //对第三个通道进行像素处理 } } imwrite(frame1_process.jpg, mat); Mat before_process_gray_Image; Mat process_gray_Image; cvtColor(mat, before_process_gray_Image, COLOR_RGB2GRAY); cvtColor(mat, process_gray_Image, COLOR_RGB2GRAY); for(int i 0;i process_gray_Image.rows;i) { for(int j 0;jprocess_gray_Image.cols;j) { process_gray_Image.atuchar(i,j) 50 - (int)process_gray_Image.atuchar(i,j); } } imwrite(gray_frame1.jpg, before_process_gray_Image); imwrite(gray_frame1_process.jpg, process_gray_Image); return 0; }2.1彩色图像素通道调整本章节代码主要是实现对一个Mat矩阵用at函数去遍历cols和rows并修改三通道像素(这里的像素是三通道图像数据)int main() { // 读取当前目录下的frame1.jpg彩色图片默认以BGR三通道格式加载到mat中 Mat mat imread(frame1.jpg); // 外层循环遍历图像每一行y轴行号i从0到mat.rows-1 for(int i 0;i mat.rows; i) { // 内层循环遍历当前行的每一列x轴列号j从0到mat.cols-1 for(int j 0;j mat.cols; j) { // 访问第i行第j列像素的第0通道B蓝色通道像素值减10后重新赋值 mat.atVec3b(i,j)[0] (int)mat.atVec3b(i,j)[0] - 10; // 访问第1通道G绿色通道像素值减50后重新赋值 mat.atVec3b(i,j)[1] (int)mat.atVec3b(i,j)[1] - 50; // 访问第2通道R红色通道像素值减10后重新赋值 mat.atVec3b(i,j)[2] (int)mat.atVec3b(i,j)[2] - 10; } } // 将处理后的彩色图像保存为frame1_process.jpg imwrite(frame1_process.jpg, mat);frame1.jpg:是没有处理处理的图像frame1_process.jpg是经过像素处理过后的图像可以看到经过处理后图像变成了绿色2.2 灰度图转换与像素处理// 定义两个灰度图Mat对象 Mat before_process_gray_Image; Mat process_gray_Image; // 将处理后的彩色图mat转为灰度图赋值给before_process_gray_Image cvtColor(mat, before_process_gray_Image, COLOR_RGB2GRAY); // 重复将同一张mat转为灰度图赋值给process_gray_Image cvtColor(mat, process_gray_Image, COLOR_RGB2GRAY); // 遍历灰度图的每一个像素 for(int i 0;i process_gray_Image.rows;i) { for(int j 0;jprocess_gray_Image.cols;j) { // 灰度像素值 50 - 原像素值 process_gray_Image.atuchar(i,j) 50 - (int)process_gray_Image.atuchar(i,j); } }gray_frame1.jpg :没有经过像素处理的灰度jpg图片gray_frame1_process.jpg :经过像素处理后的Jpg图片