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

相关推荐
猫头虎2 小时前
OpenClaw下载安装配置|Windows安装流程|macOS 安装流程|Telegram 集成使用|飞书集成使用|常见坑和注意事项保姆级教程
人工智能·windows·macos·开源·aigc·飞书·ai编程
做cv的小昊2 小时前
大语言模型系统:【CMU 11-868】课程学习笔记02——GPU编程基础1(GPU Programming Basics 1)
人工智能·笔记·学习·语言模型·llm·transformer·agent
YMWM_7 小时前
如何将包路径添加到conda环境lerobot的python路径中呢?
人工智能·python·conda
星辰_mya7 小时前
关于ai——纯笔记
人工智能
智算菩萨7 小时前
GPT-5.4原生操控电脑揭秘:从Playwright脚本到屏幕截图识别,手把手搭建你的第一个自动化智能体
人工智能·gpt·ai·chatgpt·自动化
田里的水稻7 小时前
ubuntu22.04_openclaw_ROS2
人工智能·python·机器人
一碗白开水一7 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
小程故事多_808 小时前
Vibe Coding的致命隐患,你必须知道的技术债务和扩展性危机
大数据·人工智能·aigc
童话名剑8 小时前
YOLO v3(学习笔记)
人工智能·深度学习·yolo·目标检测