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

相关推荐
IT_陈寒2 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
笃行3502 小时前
从零到上线:用 EdgeOne Makers + CodeBuddy 搭一个「对账核对员」AI Agent
人工智能
用户6856326208693 小时前
Claude Code 乱猜字段名?我给它写了一个"数据库查询约束 Skill"
人工智能
你_好3 小时前
# 给你的产品嵌入一个「会操作界面的 AI 助手」
人工智能
ShallWeL3 小时前
【机器学习】(3)—— 线性回归:梯度下降
人工智能·机器学习
陈广亮3 小时前
Prompt、Context、Harness、Agentic:LLM 应用四层嵌套结构,搞清自己卡在哪一层
人工智能
刺猬的温驯3 小时前
Flow Matching 训练的输入分布问题:从 VAE Latent 统计性质到归一化工程实践——以 VoxFlash-TTS 为例
人工智能·语音合成·tts
机器之心3 小时前
近80年后,埃尔德什经典「拉姆齐数下界」,被三位中国学者首次指数级改进
人工智能·openai
机器之心3 小时前
Nvidia都在点赞的LoopWM世界模型,竟然来自一家中国初创FaceMind?
人工智能·openai
美团技术团队4 小时前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法