Linux38:AT函数

目录

1.AT函数定义

2.代码实现at函数遍历Mat矩阵的像素点,并修改像素

[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 格式)

3.at函数的使用


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类型
  1. b = unsigned char (uchar)
  2. s = short
  3. i = int
  4. f = float
  5. 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 格式

  1. OpenCV 默认使用 BGR 格式,不是 RGB
  2. imread() 读取的图像默认是 BGR 格式
  3. 转换代码要选择正确的,比如从 BGR 转灰度要用 COLOR_BGR2GRAY
  4. 如果转换代码用错,会导致颜色显示异常

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);

相关推荐
czkm12 小时前
AI有情绪吗?从AI夸我是写作领域大神说起
人工智能·程序员·ai编程
smileNicky12 小时前
Spring AI系列之基于MCP协议实现天气预报工具插件
人工智能·spring boot·spring
deephub12 小时前
LLM 幻觉的架构级修复:推理参数、RAG、受约束解码与生成后验证
人工智能·python·大语言模型·ai幻觉
uzong12 小时前
最新:DeepSeek V4 国产大模型之光,万亿参数重构 AI 格局,让国产大模型迈入普惠新纪元
人工智能·后端
墨染天姬12 小时前
【AI】DeepSeek开源cuda算子库TileKernels
人工智能·开源
Agent手记12 小时前
多系统集成破局:企业级智能体打通异构系统的完整解决方案 | 2026全链路落地实操
人工智能·ai
sunneo12 小时前
从“生成视频”到“生成表演”:米哈游LPM 1.0如何重新定义数字角色的“灵魂”
人工智能·ai作画·aigc·ai编程·游戏美术
云烟成雨TD12 小时前
Spring AI Alibaba 1.x 系列【36】FlowAgent 和 BaseAgent 抽象类
java·人工智能·spring
山半仙xs12 小时前
基于卡尔曼滤波的人脸跟踪
人工智能·python·算法·计算机视觉
谷歌开发者12 小时前
Build with AI 深圳场|在大湾区科技浪潮中预见 AI 未来
人工智能·科技