opencv入门(5)图像像素的读写操作和算术运算

文章目录

  • 1 图像遍历与修改
    • 1.1 使用数组
    • 1.2 使用指针
  • 2 图像的算术运算
  • 2.1 一般算术操作
  • 2.2 算术API


1 图像遍历与修改

C++中支持 数组遍历 和 指针方式遍历

1.1 使用数组

访问使用 image.at(row,col) 进行访问
如果是单通道灰度图,就使用image.at进行读取
如果是三通道彩色图,就使用Image.at进行读取单个像素,通过 Image.at [0], Image.at[1], Image.at[2]读取每个通道的数据

void QuickDemo::pixel_visit_demo(Mat &image)
{int w = image.cols;int h = image.rows;int dimis = image.channels();for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dimis == 1){// 灰色图像 打印像素 几行几列的那个像素点int pv = image.at<uchar>(row, col);// 修改像素点image.at<uchar>(row, col) = 255 - pv;}if (dimis == 3){// 彩色图像 专门获取三通道的存储Vec3b bgr = image.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}imshow("像素读写演示", image);}

这边就是对三通道进行一个取反
在这里插入图片描述
在这里插入图片描述

1.2 使用指针

使用image.ptr 进行遍历

for (int row = 0; row < h; row++){uchar* current_row = image.ptr<uchar>(row);for (int col = 0; col < w; col++){if (dimis == 1){// 灰色图像 打印像素 几行几列的那个像素点int pv = *current_row;// 修改像素点*current_row++ = 255 - pv;}if (dimis == 3){// 彩色图像 专门获取三通道的存储*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}

2 图像的算术运算

2.1 一般算术操作

Mat dst;dst = image + Scalar(50, 50, 50);imshow("加法测试");

在这里插入图片描述
同样可以使用减法,除法

Mat dst;dst = image - Scalar(50, 50, 50);dst = image / Scalar(2, 2, 2);imshow("加法测试");

进行乘法时会报错,这时候需要特殊操作
使用multiply 进行乘法操作

	Mat dst;//dst = image + Scalar(50, 50, 50);Mat m = Mat::zeros(image.size(), image.type());multiply(image, m, dst);imshow("加法测试");

会进行截断操作,超过255会变成255

为避免加法也会出现超过255的操作,使用C++的数据类型转换,
saturate_cast(a,b);

Mat dst = Mat::zeros(image.size(), image.type());//dst = image + Scalar(50, 50, 50);Mat m = Mat::zeros(image.size(), image.type());/*multiply(image, m, dst);imshow("加法测试");*/m = Scalar(50, 50, 50);int w = image.cols;int h = image.rows;int dimis = image.channels();for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dimis == 1){// 灰色图像 打印像素 几行几列的那个像素点int pv = image.at<uchar>(row, col);// 修改像素点image.at<uchar>(row, col) = 255 - pv;}if (dimis == 3){// 彩色图像 专门获取三通道的存储Vec3b p1 = image.at<Vec3b>(row, col);Vec3b p2 = m.at<Vec3b>(row, col);image.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);image.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);image.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);}}}

2.2 算术API

上节已经有乘法的API
multiply(第一个mat,第二个mat, 输出结果);
加法
add(image, m, dst);
减法
subtract(image , m, dst)
除法
divide(image, m, dst)

multiply(image, m, dst);
add(image, m, dst);
subtract(image, m, dst);
divide(image, m, dst);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87096.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion入门-ControlNet 深入理解-第三课:结构类模型大揭秘——深度、分割与法线贴图

大家好,欢迎回到Stable Diffusion入门-ControlNet 深入理解系列的第三课! 在上一课中,我们深入探讨了 ControlNet 文件的命名规则,以及线条类 ControlNet模型的控制方法。如果你还没有看过第二篇,赶紧点这里补课:Stable Diffusion入门-ControlNet 深入理解 第二课:Contr…

喷油嘴深凹槽内轮廓测量的方法探究 —— 激光频率梳 3D 轮廓测量

引言 喷油嘴作为燃油喷射系统核心部件&#xff0c;其深凹槽内轮廓精度直接影响燃油雾化效果与发动机排放性能。喷油嘴深凹槽具有深径比大&#xff08;可达 30:1&#xff09;、孔径小&#xff08;φ0.5 - 2mm&#xff09;、表面质量要求高&#xff08;Ra≤0.2μm&#xff09;等…

上证ETF50期权交易规则一文详解

50ETF期权&#xff0c;首先这是期权交易&#xff0c;所以50ETF期权有期权交易的所有特征&#xff0c;其次&#xff0c;50ETF期权的标的对象是上证50&#xff0c;所以50ETF&#xff08;认购看涨&#xff09;期权的走势和上证50的走势是一样的。 行权时间&#xff1a; 在行权日当…

Oracle获取执行计划之10046 技术详解

Oracle 的 10046 事件是性能调优中最常用的工具之一&#xff0c;通过跟踪会话的 SQL 执行细节&#xff0c;生成包含执行计划、等待事件、绑定变量等信息的跟踪文件&#xff0c;帮助定位性能瓶颈。以下是技术详解&#xff1a; 一、10046 事件基础 10046 是 Oracle 内部事件&…

Linux 日志监控工具对比:从 syslog 到 ELK 实战指南

更多云服务器知识&#xff0c;尽在hostol.com 你有没有被 Linux 上满屏飞滚的日志整崩溃过&#xff1f;看着 /var/log 目录越来越肥&#xff0c;关键日志像大海捞针一样藏在里面&#xff0c;每次出故障就像拆盲盒&#xff0c;赌你能不能第一眼看出问题。 日志系统&#xff0c…

本地服务器部署后外网怎么访问不了?内网地址映射互联网上无法连接问题的排查

我的网站部署搭建在本地服务器上的&#xff0c;在内网可以正常访问&#xff0c;但是外网无法访问&#xff0c;该怎么排查&#xff1f;局域网内部经过路由器的&#xff0c;有设置了虚拟服务器转发规则&#xff0c;在互联网公网上还是无法访问服务器怎么办&#xff1f;相信很多人…

如何免费正确安装微软的office全家桶

记录一下如何正确安装微软的office全家桶 找到安装包傻瓜式安装 找到安装包 安装包在附件&#xff0c;大家可以自行进行下载 傻瓜式安装 操作一目了然&#xff0c;点你需要的就行了

论文阅读:BLIPv1 2022.2

文章目录 一、研究背景与问题现有方法的局限性研究目标 二、核心方法与创新点多模态编码器 - 解码器混合架构&#xff08;MED&#xff09;标题生成与过滤&#xff08;CapFilt&#xff09;数据自举方法 三、实验与结果数据集与训练配置关键实验发现与 state-of-the-art 方法的对…

630,百度文心大模型4.5系列开源!真香

2025年被普遍认为是AI Agent商业化的关键之年&#xff0c;而大模型正是Agent能力的核心支撑。 当开发成本大幅降低&#xff0c;我们很可能看到各种垂直领域的Agent应用如雨后春笋般涌现。 技术普惠的现实意义对于广大AI创业者和开发者来说&#xff0c;这无疑是个好消息。 之…

数据结构:递归:斐波那契数列(Fibonacci Sequence)

目录 什么是斐波那契数列&#xff1f; 用递归推导Fibonacci 复杂度分析 用迭代推导Fibonacci 复杂度分析 递归优化&#xff1a;记忆化递归&#xff08;Memoized Recursion&#xff09; 复杂度分析 什么是斐波那契数列&#xff1f; 斐波那契数列&#xff08;Fibonacci Seq…

ArcGIS Pro利用擦除工具,矢量要素消除另一矢量部分区域

选择“System Toolboxes”→“Analysis Tools.tbx”→“Overlay”→“Erase&#xff08;擦除&#xff09;”。 原始 擦除后

Linux: network: 性能 pause

最近看到一个问题,是关于网卡的throughput的性能问题,后来在ethtool-S里看到有pause的counter,这个也是网络性能问题的一个分析方向。算是学到了新的知识点。 $ grep -i -e 2025- -e pause ethtool*ens2f1np1 | grep -v -e ": 0\$" | headtail 4====

目标检测系列(五)已标注数据集(yolo格式)导入labelstudio继续标注

目录 1、labelstudio安装 2、yolo(txt)转json 3、COCO转yolo(仅针对coco格式标注信息) 4、设置环境变量并启动labelstudio 5、进入label studio创建工程并设置任务标签 6、安装http-server并启动文件映射服务 7、进入label studio导入json文件即可 1、labelstudio安装 …

pytorch底层原理学习--Libtorch

libtorch libtorch 是 PyTorch 的 C 实现版本&#xff0c;可以认为所有的pytorch底层都是由c实现&#xff0c;而pytorch的所有C实现就叫libtorch&#xff0c;也就是我们在pytorch官网getstart页面下载的cpytorch版本。我们用python写的pytorch神经网络代码都会通过pybind11将p…

TCP 三次握手协商 MSS 前,如何确定 MSS 值(附 Linux 内核源码)

文章目录 一、SYN总结影响 SYN MSS 的因素 二、SYNACK总结影响 SYNACK MSS 的因素 结合 Linux 内核源码 一、SYN 总结影响 SYN MSS 的因素 套接字选项 TCP_MAXSEG路由选项 advmss出口 MTU 减去 40(TCP 和 IP 的固定首部大小)IPV4_MAX_PMTU - 40(同上) 二、SYNACK 总结影响 SY…

扫描电子显微镜(SEM)夏令营面试基础题及答案

第二期表征问题SEM&#xff0c;后续会陆续更新其他表征 SEM和XRD一样&#xff0c;都是表征里面很常见的手段&#xff0c;基本上看论文这两个都是必不可少的 对于这部分内容&#xff0c;理解记忆&#xff1e;死记硬背&#xff0c;到时会问起来回答个大概就行&#xff0c; 像上…

Leetcode力扣解题记录--第49题(map)

题目链接&#xff1a;49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs ["eat", "tea", "tan", &quo…

AI赋能智慧餐饮:Spring Boot+大模型实战指南

⚡ 餐饮行业三大痛点 高峰期点餐拥堵&#xff1a;300人餐厅&#xff0c;15个服务员仍排长队 后厨浪费严重&#xff1a;食材损耗率高达25%&#xff0c;成本失控 顾客体验同质化&#xff1a;复购率不足30% &#x1f680; 智慧餐饮解决方案架构 &#x1f525; 核心模块代码实现…

用鸿蒙打造真正的跨设备数据库:从零实现分布式存储

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

【Docker基础】Docker数据卷:数据卷的作用与使用场景

目录 1 Docker数据卷概述 1.1 什么是数据卷 1.2 数据卷的核心特性 3 数据卷与绑定挂载的对比 2.1 技术对比 2.2 选择建议 3 数据卷的核心作用 3.1 数据持久化 3.2 数据共享 3.3 备份与迁移 4 数据卷使用场景详解 4.1 数据库应用 4.2 日志集中管理 5 数据卷操作全…