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

OpenCV入门3:像素操作

在OpenCV中,图像的像素值是以一个多维数组的形式表示的。上一篇已经介绍了cv::Mat类。对于图像中的每一个像素,可以通过Mat对象中的at<type>(i,j)函数(type可以是uchar、int等)获得Mat对象的像素值。

  • 访问像素值:
cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 获取指定像素处的像素值
unsigned char r = pixel[2]; // 获取红色通道的像素值
  • 修改像素值:
image.at<cv::Vec3b>(y, x) = cv::Vec3b(255, 0, 0); // 设置指定像素处的像素值为蓝色

对于一幅图片,如果想要对其中的一些像素点进行计算,一般通过Mat矩阵的二维循环逐一改变像素值。例如: 

  Mat image = imread("test.jpg");int rows = image.rows;int cols = image.cols;for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){Vec3b& color = image.at<Vec3b>(i, j);color[0] = 255 - color[0]; // 修改 B 像素值color[1] = 255 - color[1]; // 修改 G 像素值color[2] = 255 - color[2]; // 修改 R 像素值}}imshow("image", image);waitKey();

这段代码演示了如何遍历图像的每个像素并反转BGR通道的值,然后显示处理后的图像。

其实很多图像变换再OpenCV中已经封装了相应的功能函数,不需要开发者进行像素级的操作,下面列举几个常用的OpenCV图像变换和像素运算,后续有机会还会专门讲解图像变换。

  • 图像阈值化:

通过对图像进行阈值化操作,可以将像素值转换为二进制形式,用于图像分割、目标检测等应用。cv::threshold()是一个常用的函数,它将图像像素值与设定的阈值比较,根据条件将像素值设为给定的最大值或最小值。

cv::Mat grayImage; 
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY); // 将彩色图像转为灰度图像 
cv::Mat thresholdImage; 
cv::threshold(grayImage, thresholdImage, 128, 255, cv::THRESH_BINARY); // 将灰度图像进行二值化处理
  • 图像像素算术运算:

可以对两个图像进行像素级的算术运算,如加法、减法、乘法或除法。函数cv::add()、cv::subtract()、cv::multiply()、cv::divide()等常用于图像的像素级算术运算。

cv::Mat image1 = cv::imread("image1.jpg"); 
cv::Mat image2 = cv::imread("image2.jpg"); 
cv::Mat result; 
cv::add(image1, image2, result); // 图像相加 
cv::Mat diff; 
cv::subtract(image1, image2, diff); // 图像相减

这些是OpenCV中常见的像素级相关操作和计算的示例,包括像素值的读取和修改、图像阈值化、像素算术运算等。通过对图像的每个像素进行操作和计算,我们可以实现丰富的图像处理和分析功能。

上述代码中还用到了图像读取的函数imread()。这个函数是OpenCV中图像加载的方法。除此之外还有一些常用的图像操作的方法,举例如下:

  • 加载和保存图像:

cv::imread()函数可以读取多种图像格式的文件,例如JPEG、PNG等,cv::imwrite()函数可以将图像保存到磁盘上。例如:

  Mat image = imread("test.jpg");imwrite("output.jpg", image);
  • 图像的基本处理:

OpenCV中提供了一些基本的图像处理函数,例如resize()(调整图像大小)、reshape()(调整通道数)、copyTo()(复制图像)等。例如:

  Mat image = imread("test.jpg");Mat resizedImage;resize(image, resizedImage, Size(128, 128));imshow("image", resizedImage);waitKey();

这段代码演示了如何将图像缩小并显示缩小后的图像。

http://www.lryc.cn/news/221042.html

相关文章:

  • 使用内网穿透工具,远程测试本地接口
  • uniapp小程序才到第五层就报错navigateto:fail webview count limit exceed
  • 【C++】map set
  • 正点原子嵌入式linux驱动开发——Linux Regmap驱动
  • 京东商品详情API,页面信息采集,优惠券信息获取
  • Visual Studio 2022 + OpenCV 4.5.2 安装与配置教程
  • docker 安装 mysql (单体架构)
  • 城市内涝怎么预警?万宾科技内涝积水监测仪
  • Spring基础(2):放弃XML,走向注解
  • 【线性代数】分块矩阵总结
  • Redis-命令操作Redis->redis简介,redis的安装(Linux版本windows版本),redis的命令
  • 17、Python虚拟环境:为何要用虚拟环境、如何使用virtualenv
  • elasticSearch 接口实现查询热词统计
  • 10年测试经验分享:新手如何找到适合自己的软件测试项目?
  • 【MySQL】查询语句
  • 金蝶云星空的网络控制设置
  • linux服务器国内源安装nvm,又快又方便
  • noip模拟赛多校第八场 T3 遥控机器人 (最短路 + 技巧拆点)
  • 高防IP的原理
  • Apache Doris (五十一): Doris数据缓存
  • 一、配置环境
  • 各种 sql 语句
  • CentOS/RHEL7环境下更改网卡名称为CentOS6的传统命名规则
  • 飞书开发学习笔记(三)-利用python开发调试云文档和电子表格
  • 爆火的正规号卡推广分销 流量卡分销代理平台
  • Gin框架入门实战系列教程之Gin环境搭建 Gin程序的热加载 Gin路由 GET POST PUT DELETE
  • 浏览器自动播放音视频-前端实现方案
  • HttpUtils工具类
  • AI:59-基于深度学习的行人重识别
  • TCP编程及基础知识