news 2026/6/25 20:39:34

OPENCV——at函数遍历图像像素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OPENCV——at函数遍历图像像素

一、AT函数定义

AT函数是OPENCV中重要的函数之一,它的作用是修改Mat的矩阵某个像素值。换言之,我们需要修改图像中的像素点就需要利用AT函数去获取并且修改,AT函数的修改一般需要循环cols和rows然后对每个像素点进行修改,如上图。AT函数的定义如下:

at<typename>(int i, int j)

第一个参数:typename指的是OPENCV的向量类型,向量类型如下:

typedef Vec<uchar, 2> Vec2buchar类型的数组,长度为2, 它表示的是二维图像的位置信息、尺寸等等

typedef Vec<uchar, 3> Vec3buchar类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是uchar类型

typedef Vec<uchar, 4> Vec4buchar类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是uchar类型

typedef Vec<short, 2> Vec2sshort类型的数组,长度为2, 它表示的是二维图像的位置信息、尺寸等等,但不能做像素处理

typedef Vec<short, 3> Vec3sshort类型的数组,长度为3, 它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是short类型

typedef Vec<short, 4> Vec4sshort类型的数组,长度为4, 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是short类型

typedef Vec<ushort, 2> Vec2wushort类型的数组,长度为2,它表示的是二维图像的位置信息、尺寸等等,但不能做像素处理

typedef Vec<ushort, 3> Vec3wushort类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是ushort类型

typedef Vec<ushort, 4> Vec4wushort类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是ushort类型

typedef Vec<int, 2> Vec2i:int类型的数组,长度为2, 它表示的是一个包含2个整数的元素向量,并不能直接表示通道数

typedef Vec<int, 4> Vec4i:int类型的数组,长度为4, 它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是int类型

typedef Vec<int, 6> Vec6i:int类型的数组,长度为6, 它常用于表示六维图像,包括:坐标、描述子、颜色直方等等,但是不能对六维图像直接进行处理

typedef Vec<int, 8> Vec8i:int类型的数组,长度为8, 它常用于表示八维图像,包括:坐标、描述子、颜色直方等等,但是不能对八维图像直接进行处理

typedef Vec<float, 2> Vec2ffloat类型的数组,长度为2,它表示的是二维图像的位置信息,但不能做通道处理

typedef Vec<float, 3> Vec3ffloat类型的数组,长度为3,它常用于彩色图像的像素值以及对rgb三个通道的处理,并且通道的像素值都是浮点数

typedef Vec<float, 4> Vec4ffloat类型的数组,长度为4,它常用于彩色图像的像素值以及对argb四个通道的处理,并且通道的像素值都是浮点数

typedef Vec<float, 6> Vec6f:float类型的数组,长度为4,他用于处理6个维度的图像数据,需要注意的是Vec6f仅仅能表示具有6个维度的数据,并不可以对数据进行操作.

typedef Vec<double, 2> Vec2ddouble类型的数组,长度为2,在图像处理中Vec2d仅仅只是表示具有double类型的图像数据,但是并不能直接操作数据像素

typedef Vec<double, 3> Vec3ddouble类型的数组,长度为3,它常用于表示图像的彩色三通道,分别是R(红色)、G(绿色)、B(蓝色),并且对于这三个通道的像素值进行double类型数据的处理

typedef Vec<double, 4> Vec4ddouble类型的数组,长度为4,它常用于表示图像的彩色四通道,分别是A(透明度)、R(红色)、G(绿色)、B(蓝色),并且对于这四个通道的像素值进行double类型数据的处理。

需要注意的是:一般OPENCV对像素的处理大部分都是用uchar类型,其他类型用的很少。

第二个参数:i,指的是rows,图像的行数据

第三个参数:j,指的是cols,图像的列数据

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

#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() { Mat mat = imread("frame1.jpg"); for(int i = 0;i < mat.rows; i++) { for(int j = 0;j < mat.cols; j++) { mat.at<Vec3b>(i,j)[0] = (int)mat.at<Vec3b>(i,j)[0] - 10; //对第一个通道进行像素处理 mat.at<Vec3b>(i,j)[1] = (int)mat.at<Vec3b>(i,j)[1] - 50; //对第二个通道进行像素处理 mat.at<Vec3b>(i,j)[2] = (int)mat.at<Vec3b>(i,j)[2] - 10; //对第三个通道进行像素处理 } } imwrite("frame1_process.jpg", mat); Mat before_process_gray_Image; Mat process_gray_Image; cvtColor(mat, before_process_gray_Image, COLOR_RGB2GRAY); cvtColor(mat, process_gray_Image, COLOR_RGB2GRAY); for(int i = 0;i< process_gray_Image.rows;i++) { for(int j = 0;j<process_gray_Image.cols;j++) { process_gray_Image.at<uchar>(i,j) = 50 - (int)process_gray_Image.at<uchar>(i,j); } } imwrite("gray_frame1.jpg", before_process_gray_Image); imwrite("gray_frame1_process.jpg", process_gray_Image); return 0; }

2.1彩色图像素通道调整

本章节代码主要是实现对一个Mat矩阵用at函数去遍历cols和rows,并修改三通道像素(这里的像素是三通道图像数据),

int main() { // 读取当前目录下的frame1.jpg彩色图片,默认以BGR三通道格式加载到mat中 Mat mat = imread("frame1.jpg"); // 外层循环:遍历图像每一行(y轴,行号i从0到mat.rows-1) for(int i = 0;i < mat.rows; i++) { // 内层循环:遍历当前行的每一列(x轴,列号j从0到mat.cols-1) for(int j = 0;j < mat.cols; j++) { // 访问第i行第j列像素的第0通道(B蓝色通道),像素值减10后重新赋值 mat.at<Vec3b>(i,j)[0] = (int)mat.at<Vec3b>(i,j)[0] - 10; // 访问第1通道(G绿色通道),像素值减50后重新赋值 mat.at<Vec3b>(i,j)[1] = (int)mat.at<Vec3b>(i,j)[1] - 50; // 访问第2通道(R红色通道),像素值减10后重新赋值 mat.at<Vec3b>(i,j)[2] = (int)mat.at<Vec3b>(i,j)[2] - 10; } } // 将处理后的彩色图像保存为frame1_process.jpg imwrite("frame1_process.jpg", mat);

frame1.jpg:是没有处理处理的图像

frame1_process.jpg是经过像素处理过后的图像,可以看到经过处理后,图像变成了绿色

2.2 灰度图转换与像素处理

// 定义两个灰度图Mat对象 Mat before_process_gray_Image; Mat process_gray_Image; // 将处理后的彩色图mat转为灰度图,赋值给before_process_gray_Image cvtColor(mat, before_process_gray_Image, COLOR_RGB2GRAY); // 重复将同一张mat转为灰度图,赋值给process_gray_Image cvtColor(mat, process_gray_Image, COLOR_RGB2GRAY); // 遍历灰度图的每一个像素 for(int i = 0;i< process_gray_Image.rows;i++) { for(int j = 0;j<process_gray_Image.cols;j++) { // 灰度像素值 = 50 - 原像素值 process_gray_Image.at<uchar>(i,j) = 50 - (int)process_gray_Image.at<uchar>(i,j); } }

gray_frame1.jpg :没有经过像素处理的灰度jpg图片

gray_frame1_process.jpg :经过像素处理后的Jpg图片

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 20:39:05

高规格仪式化空间动线设计:从神经科学到落地参数的全流程指南

1. 项目概述&#xff1a;一场“大场面”背后的系统性工程“The Art of the Grand Entrance”——这个标题乍一听像是一本舞台剧导演手记&#xff0c;或是某位米其林主厨的私房菜谱封面&#xff0c;但其实它精准指向一个被严重低估、却高频出现在我们生活关键节点中的专业领域&a…

作者头像 李华
网站建设 2026/6/25 20:38:53

Translumo终极指南:3步掌握Windows最强实时屏幕翻译工具

Translumo终极指南&#xff1a;3步掌握Windows最强实时屏幕翻译工具 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否…

作者头像 李华
网站建设 2026/6/25 20:38:32

Phi-4-Mini与Phi-4-Multimodal:轻量级本地多模态AI实战指南

1. 项目概述&#xff1a;当“小模型”开始真正扛起日常智能的担子 最近在刷技术动态时&#xff0c;看到微软悄悄发布了 Phi-4-Mini 和 Phi-4-Multimodal 这两个新模型&#xff0c;标题里那个“Small and Cool”真不是营销话术——我第一时间下载了公开权重、搭了本地推理环…

作者头像 李华
网站建设 2026/6/25 20:36:36

手写梯度可视化沙盒:让神经网络学习过程看得见

1. 项目概述&#xff1a;这不是又一节“神经网络入门”&#xff0c;而是一次对直觉与数学边界的重新测绘“Intro to Neural Networks Part II — Brilliant.org”这个标题乍看平平无奇&#xff0c;像是在线教育平台里再普通不过的一节进阶课。但如果你真点开它&#xff0c;会发…

作者头像 李华
网站建设 2026/6/25 20:33:22

AI落地七道关卡:从能跑到敢用的工程化实践指南

1. 这不是一句口号&#xff0c;而是一场持续三年的实战拉锯战“The quest for the perfect AI solution”——这句话乍看像科技媒体的标题党&#xff0c;或是某家SaaS公司的宣传slogan。但在我过去三年深度参与17个AI落地项目的过程中&#xff0c;它早已褪去修辞色彩&#xff0…

作者头像 李华
网站建设 2026/6/25 20:30:18

如何用一款免费插件告别网盘限速?三大核心功能让你下载飞起来!

如何用一款免费插件告别网盘限速&#xff1f;三大核心功能让你下载飞起来&#xff01; 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / …

作者头像 李华