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

相关推荐
重生之我要成为代码大佬11 分钟前
HuggingFace生态实战:从模型应用到高效微调
人工智能·python·大模型·huggingface·模型微调
CoderIsArt24 分钟前
深度学习编译器中的TVM 与MLR
人工智能·深度学习
wenzhangli724 分钟前
OoderAgent Apex:基于Skills化架构的热插拔启动机制
人工智能·架构
爱睡懒觉的焦糖玛奇朵29 分钟前
【工业级落地算法之人员摔倒检测算法详解】
人工智能·python·深度学习·神经网络·算法·yolo·目标检测
一水鉴天32 分钟前
从 整体设计的三个问题 到 中文能藏英文所限显 之1 20260303 codebuddy
人工智能
~央千澈~37 分钟前
《2026鸿蒙NEXT纯血开发与AI辅助》第三章:DevEco Studio 整体功能使用详解以及各个助手以及核心使用方法-卓伊凡
人工智能·鸿蒙开发·鸿蒙next
Learn Beyond Limits37 分钟前
长短期记忆网络|LSTM(Long Short-Term Memory)
人工智能·rnn·深度学习·神经网络·自然语言处理·nlp·lstm
昨夜见军贴061642 分钟前
AI报告文档审核助力本地化升级:IACheck如何支撑食品加工行业数据安全与质量协同发展
大数据·人工智能
大佐不会说日语~1 小时前
Spring AI Alibaba 模块化重构:从单体到分层架构实践
人工智能·spring·重构
笨笨饿1 小时前
26_为什么工程上必须使用拉普拉斯变换
c语言·开发语言·人工智能·嵌入式硬件·机器学习·编辑器·概率论