当前位置: 首页 > news >正文

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.lqws.cn/news/598321.html

相关文章:

  • VCenter SSL过期,登录提示HTTP 500错误解决办法
  • 应急响应靶机-linux1-知攻善防实验室
  • 动态库与符号表综合指南
  • Github CLI 快速 clone下载到本地教程
  • C# WPF + Helix Toolkit 实战:用两种方式打造“六面异色立方体”
  • OpenCV图像梯度处理详解:原理、API与实战代码解析
  • Java 中 List.stream() 的全面使用指南(含完整示例)
  • jQuery 安装使用教程
  • OpenCV CUDA模块设备层-----二值化阈值操作函数thresh_binary_func()
  • android车载开发之HVAC
  • Conda 虚拟环境克隆与 PyCharm 配置教程
  • C# 程序:查看 PageUp 热键消息映射表
  • 系统性能优化-9 HTTP1.1
  • 柱塞泵体结构化网格划分
  • 408第三季part1 - 操作系统 - 基本分页II
  • 【仿muduo库实现并发服务器】Channel模块
  • 安卓内核定制开发笔记(三)系统调用Hook
  • 打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录
  • 计算机网络(二)应用层HTTP协议
  • 数据结构day6——内核链表
  • 修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
  • ESP32-S3开发板深度评测:AI语音识别与图像处理全面解析
  • [2025CVPR]DE-GANs:一种高效的生成对抗网络
  • Android屏幕共享+WebSocket实现传输截图
  • 【代码审计】安全审核常见漏洞修复策略
  • Vue 3 中的 `h` 函数详解
  • android RecyclerView隐藏整个Item后,该Item还占位留白问题
  • 【Java编程动手学】Java的“三体”世界:JVM、JRE、JDK的共生之道
  • 从 0 到 1 构建可视化限流演示:React + Framer Motion 实现 Token Bucket 动画
  • 折线图多数据处理