目录
[1.void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);](#1.void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);)
[2.OpenCV 默认使用 BGR 格式](#2.OpenCV 默认使用 BGR 格式)
1.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类型
- b = unsigned char (uchar)
- s = short
- i = int
- f = float
- d = double
需要注意的是:一般OPENCV对像素的处理大部分都是用uchar类型,其他类型用的很少。
第二个参数:I,指的是rows,图像的行数据
第三个参数:j,指的是cols,图像的列数据
2.代码实现at函数遍历Mat矩阵的像素点,并修改像素
2.1,本章节代码主要是实现对一个mat矩阵用at函数去遍历cols和rows,并修改三通道像素(这里的像素是三通道图像数据)。(如图一),大概的代码如下:



上面代码就是对图像的三个通道进行处理,第一个通道的数值-10.第二个通道的数值-50.第三个通道的数值-10。
2.2.本章节代码主要是实现对一个Mat矩阵用at函数去遍历cols和rows,并修改单通道像素,大概的代码如下



cs
#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()
{
// 读取图像文件"file1.jpg",返回Mat对象(矩阵)
// Mat是OpenCV中存储图像的基本数据结构
Mat mat = imread("file1.jpg");
// 外层循环:遍历图像的所有行(高度)
for(int i = 0; i < mat.rows; i++)
{
// 内层循环:遍历当前行的所有列(宽度)
for(int j = 0; j < mat.cols; j++)
{
// at<Vec3b>(i,j) 访问第i行第j列的像素
// Vec3b是一个包含3个uchar类型元素的向量,分别代表B、G、R三个通道
// [0] 蓝色通道:减去10,使图像偏黄(减少蓝色)
mat.at<Vec3b>(i,j)[0] = mat.at<Vec3b>(i,j)[0] - 10;
// [1] 绿色通道:减去50,使图像偏紫(减少绿色)
mat.at<Vec3b>(i,j)[1] = mat.at<Vec3b>(i,j)[1] - 50;
// [2] 红色通道:减去10,使图像偏青(减少红色)
mat.at<Vec3b>(i,j)[2] = mat.at<Vec3b>(i,j)[2] - 10;
}
}
// 将修改后的彩色图像保存为"file1_at.jpg"
imwrite("file1_at.jpg", mat);
// 声明两个Mat对象,用于存储灰度图像
Mat before_process_gray_img; // 将存储原始图像的灰度版本
Mat process_grey_img; // 将存储处理后的灰度版本
// 将修改后的彩色图像(mat)转换为灰度图像
// COLOR_BGR2GRAY:将BGR彩色图像转换为单通道灰度图像
cvtColor(mat, before_process_gray_img, COLOR_BGR2GRAY);
// 再次将修改后的彩色图像转换为灰度图像(用于后续处理)
cvtColor(mat, process_grey_img, COLOR_BGR2GRAY);
// 对process_grey_img进行进一步处理
// 外层循环:遍历灰度图像的所有行
for(int i = 0; i < process_grey_img.rows; i++)
{
// 内层循环:遍历灰度图像的所有列
for(int j = 0; j < process_grey_img.cols; j++)
{
// at<uchar>(i,j) 访问灰度图像第i行第j列的像素值
// 灰度图像每个像素只有一个值(0-255)
// 公式:新值 = 50 - 原值
// 这将产生反相效果,但以50为基准而不是255
process_grey_img.at<uchar>(i,j) = 50 - process_grey_img.at<uchar>(i,j);
}
}
// 保存处理前的灰度图像(原始彩色图像的灰度版本)
imwrite("file1_gray.jpg", before_process_gray_img);
// 保存处理后的灰度图像(经过50-原值处理后的版本)
imwrite("file1_gray_process.jpg", process_grey_img);
return 0;
}
注意:
1.void cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
参数说明:
- src: 输入图像
- dst: 输出图像
- code: 颜色空间转换代码(如 COLOR_BGR2GRAY)
- dstCn: 输出图像的通道数(默认0表示自动从code推导)
常用的转换代码:

2.OpenCV 默认使用 BGR 格式
- OpenCV 默认使用 BGR 格式,不是 RGB
imread()读取的图像默认是 BGR 格式- 转换代码要选择正确的,比如从 BGR 转灰度要用
COLOR_BGR2GRAY - 如果转换代码用错,会导致颜色显示异常
3.at函数的使用
三通道
// at<Vec3b>(i,j) 访问第i行第j列的像素
// Vec3b是一个包含3个uchar类型元素的向量,分别代表B、G、R三个通道
// [0] 蓝色通道:减去10,使图像偏黄(减少蓝色)
mat.at<Vec3b>(i,j)[0] = mat.at<Vec3b>(i,j)[0] - 10;
// [1] 绿色通道:减去50,使图像偏紫(减少绿色)
mat.at<Vec3b>(i,j)[1] = mat.at<Vec3b>(i,j)[1] - 50;
// [2] 红色通道:减去10,使图像偏青(减少红色)
mat.at<Vec3b>(i,j)[2] = mat.at<Vec3b>(i,j)[2] - 10;
单通道
process_grey_img.at<uchar>(i,j) = 50 - process_grey_img.at<uchar>(i,j);