OpenCV4.9的是如何进行图像操作

返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV4.9矩阵上的掩码操作

下一篇:使用 OpenCV 添加(混合)两个图像 

输入/输出

C++

图像

从文件加载图像

 Mat img = imread(filename);

如果您读取jpg文件,则默认情况下会创建一个 3 通道图像。如果需要灰度图像,请使用:

 Mat img = imread(filename, IMREAD_GRAYSCALE);

注意

文件的格式由其内容(前几个字节)决定。要将图像保存到文件:

 imwrite(filename, img);

Java

从文件加载图像

Mat img = Imgcodecs.imread(filename);

如果您读取jpg文件,则默认情况下会创建一个 3 通道图像。如果需要灰度图像,请使用:

Mat img = Imgcodecs.imread(filename, Imgcodecs.IMREAD_GRAYSCALE);

 注意

文件的格式由其内容(前几个字节)决定。要将图像保存到文件:

 Imgcodecs.imwrite(filename, img);

  Python

从文件加载图像

 img = cv.imread(filename)

如果您读取jpg文件,则默认情况下会创建一个 3 通道图像。如果需要灰度图像,请使用:

 img = cv.imread(filename, cv.IMREAD_GRAYSCALE)

注意

文件的格式由其内容(前几个字节)决定。要将图像保存到文件:

 cv.imwrite(filename, img)

Note

Format of the file is determined by its extension.

Use cv::imdecode and cv::imencode to read and write an image from/to memory rather than a file.

图像的基本操作

访问像素强度值

为了获得像素强度值,您必须知道图像的类型和通道数。以下是单通道灰度图像(类型 8UC1)和像素坐标 x 和 y 的示例:

C++:

 Scalar intensity = img.at<uchar>(y, x);

Java:

 byte[] imgData = new byte[(int) (img.total() * img.channels())];
 img.get(0, 0, imgData);
 byte intensity = imgData[y * img.cols() + x];

 Python

 _intensity = img[y,x]

仅限 C++ 版本:intensity.val[0] 包含从 0 到 255 的值。请注意 x 和 y 的顺序。由于在 OpenCV 中,图像由与矩阵相同的结构表示,因此我们对这两种情况都使用相同的约定 - 从 0 开始的行索引(或 y 坐标)排在前面,从 0 开始的列索引(或 x 坐标)紧随其后。或者,您可以使用以下表示法(仅限 C++):

 Scalar intensity = img.at<uchar>(Point(x, y));

现在让我们考虑一个具有 BGR 颜色排序的 3 通道图像(imread 返回的默认格式):

C++ code

 Vec3b intensity = img.at<Vec3b>(y, x);
 uchar blue = intensity.val[0];
 uchar green = intensity.val[1];
 uchar red = intensity.val[2];

Python Python

 _blue = img[y,x,0]
 _green = img[y,x,1]
 _red = img[y,x,2]

您可以对浮点图像使用相同的方法(例如,您可以通过在 3 通道图像上运行 Sobel 来获取此类图像)(仅限 C++):

 Vec3f intensity = img.at<Vec3f>(y, x);
 float blue = intensity.val[0];
 float green = intensity.val[1];
 float red = intensity.val[2];

可以使用相同的方法来更改像素强度:

​img.at<uchar>(y, x) = 128;

Java: 

 byte[] imgData = new byte[(int) (img.total() * img.channels())];
 imgData[y * img.cols() + x] = (byte) 128;
 img.put(0, 0, imgData);

 Python:

 img[y,x] = 128

OpenCV 中有一些函数,尤其是来自 calib3d 模块的函数,例如 cv::p rojectPoints,它们以 Mat 的形式采用 2D 或 3D 点数组。 矩阵应该只包含一列,每行对应一个点,矩阵类型应该相应为 32FC2 或 32FC3。这样的矩阵可以很容易地从(仅限 C++ )构造:std::vector

 vector<Point2f> points;
 //... fill the array
 Mat pointsMat = Mat(points);

可以使用相同的方法(仅限 C++)访问此矩阵中的点:Mat::at

 Point2f point = pointsMat.at<Point2f>(i, 0);

内存管理和引用计数

Mat 是一种保留矩阵/图像特征(行和列数、数据类型等)和指向数据的指针的结构。因此,没有什么能阻止我们拥有多个对应于相同数据的 Mat 实例。Mat 保留一个引用计数,用于指示在 Mat 的特定实例被销毁时是否必须解除分配数据。下面是在不复制数据的情况下创建两个矩阵的示例(仅限 C++):

 std::vector<Point3f> points;
 // .. fill the array
 Mat pointsMat = Mat(points).reshape(1);

结果,我们得到一个具有 3 列的 32FC1 矩阵,而不是具有 1 列的 32FC3 矩阵。 pointsMat使用来自点的数据,并且在销毁时不会释放内存。但是,在这种特定情况下,开发人员必须确保points的生存期长于pointsMat如果我们需要复制数据,则可以使用例如, cv::Mat::copyTo or cv::Mat::clone:

 img = cv.imread('image.jpg')
 _img1 = np.copy(img)

可以为每个功能提供一个空的输出垫。每个实现都为目标矩阵调用 Mat::create。如果矩阵为空,此方法为矩阵分配数据。如果它不是空的,并且具有正确的大小和类型,则该方法不执行任何操作。但是,如果大小或类型与输入参数不同,则数据将解除分配(并丢失)并分配新数据。例如:

 Mat img = imread("image.jpg");
 Mat sobelx;
 Sobel(img, sobelx, CV_32F, 1, 0);

原始操作

在矩阵上定义了许多方便的运算符。例如,以下是我们如何从现有的灰度图像制作黑色图像img

 img = Scalar(0);

选择感兴趣的区域:

 Rect r(10, 10, 100, 100);
 Mat smallImg = img(r);

从彩色到灰度的转换:

 Mat img = imread("image.jpg"); // loading a 8UC3 image
 Mat grey;
 cvtColor(img, grey, COLOR_BGR2GRAY);

将映像类型从 8UC1 更改为 32FC1:

src.convertTo(dst, CV_32F);

可视化图像

在开发过程中查看算法的中间结果非常有用。OpenCV 提供了一种可视化图像的便捷方法。可以使用以下方式显示 8U 图像:

 Mat img = imread("image.jpg");
 namedWindow("image", WINDOW_AUTOSIZE);
 imshow("image", img);
 waitKey();

对 waitKey() 的调用会启动一个消息传递循环,该循环在“image”窗口中等待击键。32F 镜像需要转换为 8U 类型。例如:

 Mat img = imread("image.jpg");
 Mat grey;
 cvtColor(img, grey, COLOR_BGR2GRAY);
 Mat sobelx;
 Sobel(grey, sobelx, CV_32F, 1, 0);
 double minVal, maxVal;
 minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities
 Mat draw;
 sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal));
 namedWindow("image", WINDOW_AUTOSIZE);
 imshow("image", draw);
 waitKey();

注意

这里 cv::namedWindow 不是必需的,因为它后面紧跟着 cv::imshow。不过,它可用于更改窗口属性或使用 cv::createTrackbar 

参考文献:

1、《Operations with images》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新

NVIDIA 宣布推出适用于人形机器人的 GR00T 项目基础模型和主要 Isaac 机器人平台更新 Isaac 机器人平台现为开发人员提供新的机器人训练模拟器、Jetson Thor 机器人计算机、生成式 AI 基础模型以及 CUDA 加速感知和操作库 GTC — NVIDIA 今天宣布推出 GR00T 项目&#xff0c;这…

【数据分享】1929-2023年全球站点的逐月平均露点(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

为什么有些网站会提示不安全,提示您与此网站之间建立的连接不安全

有时候当我们尝试访问一个网站时&#xff0c;浏览器会弹出一个警告&#xff0c;提示“您与此网站之间建立的连接不安全”。这是什么意思&#xff1f;这种网站真的不安全吗&#xff1f; 理解HTTP与HTTPS HTTP&#xff08;超文本传输协议&#xff09;是互联网上用于传输数据的基…

利用sin/cos原理驱动步进电机

利用sin/cos原理控制步进电机转动 前言什么是步进电机驱动器细分控制电机内部结构图片步进电机驱动原理&#xff08;重要&#xff09;步进电机参数&#xff11;、步距角&#xff1a;收到一个脉冲转动的角度&#xff12;、细分数 &#xff1a;&#xff11;&#xff0f;&#xf…

qrcode插件-生成二维码

安装 yarn add qrcodejs2 --save npm install qrcodejs2 --save 使用 <template><div><div id"qrcodeImg"></div><!-- 创建一个div&#xff0c;并设置id --></div> </template> <script> import QRCode from q…

【超图 SuperMap3D】【基础API使用示例】52、超图SuperMap3D - 绘制点|线|多边形面的缓冲区

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 绘制缓冲区主要依赖[turfjs](https://turfjs.org/docs/#buffer) 先根据点线面的数据turfjs计算得到缓冲区的坐标数据&#xff0c;再行绘制效果 完整代…

《深入Linux内核架构》第3章 内存管理(3)

目录 3.3 页表 3.3.1 数据结构 3.3.2 特定于PTE的信息 3.3.3 页表项的创建和操作 3.3 页表 页表作用&#xff1a; 将虚拟地址转换为物理地址。 内核总是使用四级页表。所以如果体系架构只支持两级页表&#xff0c;则需模拟第三和第四级页表。 四级页表&#xff1a; PGD&am…

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

【Java项目】基于jspssm的高校二手交易平台

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网技术的不断进步&#xff0c;高校二手交易市场通过网络平台得到了显著的扩展。开发这一平台时&#xff0c;首要任务是深入挖掘并满足用户的实际需求&#xff0c;通过精准把握用户需求来构建一个专门化的高校二手交易系…

基于Django(python+sql)的校园二手交易系统设计与实现(完整程序+开题报告+论文)

随着互联网的迅猛发展&#xff0c;校园内的二手交易市场也逐渐呈现出蓬勃的发展态势。学生们在校园生活中会产生大量的闲置物品&#xff0c;而其他学生也有可能需要这些物品。本论文研究了校园二手交易系统的需求分析、系统实现和测试三个部分&#xff0c;旨在提高校园二手交易…

10.测试教程-性能测试loadrunner1

文章目录 1.LoadRunner的安装2.Loadrunner的基本概念3.开发测试脚本3.1录制基本的用户脚本3.2插入事务3.3插入集合点3.4参数化输入3.5插入函数3.6插入检查点3.7运行时设置3.8单机运行测试脚本 4.玩转三个测试工具4.1Virtual User Generator(此处讲解和3.1是一致的)4.2Controlle…

简单破除github的2FA验证

简单破除github的2FA验证 文章目录 简单破除github的2FA验证&#x1f468;‍&#x1f3eb;Authenticator工具 &#x1f468;‍&#x1f3eb;Authenticator工具 最近使用github的时候发现要搞一个2FA的验证才可以 验证的途径有两种&#xff1a;一种是用手机电话验证&#xff0c;…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…

HTML作业2

作业1: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>table…

金三银四面试题(四):Full GC 和 Minor GC

如何触发Full GC&#xff1f;这是面试中的高频题。同样了解Full GC和Minor GC对于理解Java应用程序的性能和内存管理非常重要。 区分 GC 在此之前&#xff0c;我们要搞清楚&#xff0c;什么是Full GC&#xff0c;什么是Minor GC&#xff1f; Minor GC Minor GC是Java虚拟机…

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系&#xff0c;可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准&#xff0c;其采用的是YAML&#xff0c;我们看到的所有Unity自定义的Asset格式&#xff0c;例如.prefab&#xff08;预制体&#x…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展&#xff0c;网络化的工作模式已经几乎覆盖到各个工作领域中的业务内&#xff0c;人们的日常生活也渐渐离不开互联网。因此&#xff0c;在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

Java前端控制器模式

文章目录 以下是Java前端控制器模式的主要组成部分和工作原理&#xff1a;组件与角色&#xff1a;工作流程&#xff1a;应用场景与优势&#xff1a; Java Web应用程序示例 Java前端控制器模式是一种软件设计模式&#xff0c;它在构建基于Java的Web应用程序时特别有用&#xff0…

基于springboot实现在线拍卖系统项目【项目源码+论文说明】

基于springboot实现在线拍卖系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍…