openCV—图像入门(python)
目录
目标
使用OpenCV
显示图像
写入图像
总结使用
使用Matplotlib
注:图片后续补充
目标
在这里,你将了解如何使用Python编程语言中的OpenCV库,实现读取、显示和保存图像的功能。具体来说,你将学习以下函数的用法:cv.imread() 用于读取图像,cv.imshow() 用于显示图像,cv.imwrite() 用于将图像保存到本地文件系统中。
如果你有兴趣,还可以学习如何使用Matplotlib库来显示图像,这也是一种常见的图像显示方式。
在使用OpenCV库读取图像时,需要使用cv.imread()函数。读取图像时,需要提供图像文件的路径或文件名,函数将返回一个图像对象。
使用OpenCV
除此之外,cv.imread()函数还可以接收一个额外的参数,用于指定图像的读取方式。具体来说,可以使用以下三个标志:
- cv.IMREAD_COLOR:用于加载彩色图像,会忽略任何图像的透明度,这也是默认标志;
- cv.IMREAD_GRAYSCALE:用于以灰度模式加载图像;
- cv.IMREAD_UNCHANGED:用于加载图像,包括alpha通道。
此外,还可以传递整数1、0或-1来表示这三个标志。
下面是使用cv.imread()函数读取图像的示例代码:
import numpy as np
import cv2 as cv#加载彩色灰度图像
img = cv.imread('messi5.jpg', 0)
在这里:0代表读取灰度图像,即将彩色图像转换为灰度图像
另外:
- cv.IMREAD_COLOR 或 1:读取彩色图像,忽略 alpha 通道,相当于使用默认值 1。
- cv.IMREAD_GRAYSCALE 或 0:读取灰度图像。
- cv.IMREAD_UNCHANGED 或 -1:读取原始图像,包括 alpha 通道(如果有)。
下面为效果图(没有报错代表读取成功):
警告
如果在使用OpenCV库读取图像时,提供的图像路径错误,不会引发任何错误,但是打印读取的图像对象时将返回None。换句话说,即使图像路径错误,程序也不会崩溃或抛出异常,而是返回一个空对象。
因此,为了确保程序能够正确读取图像,建议在提供图像路径之前,先检查路径是否正确,以避免意外的错误。
显示图像
使用函数**cv.imshow()**可以在窗口中显示图像。该函数会自动根据图像尺寸调整窗口大小。
在调用**cv.imshow()**函数时,第一个参数是窗口名称,是一个字符串类型的值。第二个参数是要显示的图像对象。你可以创建多个窗口,并指定不同的窗口名称,以显示多个图像。
import cv2 as cv#加载彩色灰度图像
img = cv.imread('messi5.jpg',0)cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
窗口的屏幕截图如下所示:
在使用OpenCV库显示图像时,我们需要使用函数cv.imshow()。该函数需要一个窗口名称作为第一个参数,并需要传递要显示的图像作为第二个参数。调用该函数后,可以使用**cv.waitKey()**函数等待用户交互事件。
cv.waitKey()函数是一个键盘绑定函数,它等待指定毫秒数的时间,等待用户按下任何键或交互事件发生。
如果时间到期时仍未发生交互事件,则程序将继续执行。如果将0作为参数传递,则程序将无限等待用户交互事件。该函数还可以用于检测特定按键的按下事件,例如按下键盘上的字母a。需要注意的是,为了确保图像能够正确显示,必须在显示图像后使用cv.waitKey()**函数。
cv.destroyAllWindows()函数可以用于销毁我们创建的所有窗口,而cv.destroyWindow()函数可以销毁特定的窗口。
需要注意的是,在某些情况下,可以在创建一个空的窗口之后再将图像加载到该窗口中。这时,可以使用cv.namedWindow()**函数来设置窗口的属性,例如是否可以调整窗口大小。如果需要显示的图像尺寸过大或需要在窗口中添加跟踪栏时,可以使用该函数来设置窗口大小。
下面是使用OpenCV库显示图像的示例代码:
cv.namedWindow('image',cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()
效果图
写入图像
在使用OpenCV库保存图像时,需要使用函数cv.imwrite()。该函数需要两个参数:第一个参数是要保存的文件名,第二个参数是要保存的图像对象。
具体来说,你可以像这样调用cv.imwrite()函数:cv.imwrite('messigray.png',img)。这将会把图像以PNG格式保存在工作目录中,文件名为'messigray.png'。
需要注意的是,cv.imwrite()函数可以保存多种不同格式的图像,例如PNG、JPEG、BMP等。在调用该函数时,需要根据需要指定要保存的图像格式,即文件扩展名。
总结使用
下面的代码演示了如何使用OpenCV库加载、显示和保存图像。具体来说,它加载一张灰度图像,将其显示在屏幕上,等待用户按下键盘按键。如果用户按下's'键,则程序将保存图像到本地,并退出;如果用户按下'ESC'键,则程序将直接退出而不保存图像。
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # 等待ESC退出cv.destroyAllWindows()
elif k == ord('s'): # 等待关键字,保存和退出cv.imwrite('messigray.png',img)cv.destroyAllWindows()
警告
如果使用的是64位计算机,则必须k = cv.waitKey(0)按如下所示修改行:k = cv.waitKey(0) & 0xFF。
这是因为在64位计算机上,**cv.waitKey()**函数返回一个64位整数,但是ASCII码值只有8位。因此,将返回值与0xFF(即255)进行按位与运算,可以保留返回值的低8位,这是ASCII码的有效范围。
这种修改可以确保在64位计算机上正确读取键盘输入,并避免潜在的兼容性问题。
使用Matplotlib
Matplotlib是一款Python的绘图库,可以提供多种绘图方法,方便进行数据可视化和图像处理。在接下来的学习中,你将学习到如何使用Matplotlib库来展示和处理图像。通过Matplotlib,你可以方便地对图像进行缩放、保存等操作。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
plt.show()
窗口的屏幕截图如下所示:
另外,有空可看看:
Matplotlib提供了许多绘图选项,可以根据需求进行图像的处理和展示。如果需要了解更多的绘图选项,可以参考Matplotlib文档以获取更多详细信息,其中会涵盖许多实用的技巧和方法。
需要注意的是:
当使用OpenCV加载彩色图像时,它处于BGR模式,而Matplotlib以RGB模式显示图像。因此,如果使用OpenCV加载彩色图像,那么在Matplotlib中将无法正确显示彩色图像。如果遇到这种情况,可以采用一些转换方法来将图像从BGR模式转换为RGB模式,以便正确地在Matplotlib中显示彩色图像。关于这个问题,我们将在接下来的练习中进行更详细的讨论。
相关文章:

openCV—图像入门(python)
目录 目标 使用OpenCV 显示图像 写入图像 总结使用 使用Matplotlib 注:图片后续补充 目标 在这里,你将了解如何使用Python编程语言中的OpenCV库,实现读取、显示和保存图像的功能。具体来说,你将学习以下函数的用法…...

关于一个Java程序员马上要笔试了,临时抱佛脚,一晚上恶补45道简单SQL题,希望笔试能通过
MySQL随手练 / DQL篇 MySQL随手练——DQL篇 题目网盘下载:https://pan.baidu.com/s/1Ky-RJRNyfvlEJldNL_yQEQ?pwdlana 初始数据 表 course 表 student 表 teacher 表 sc 答案 :) —> :( —> :) 1. 查询 "01"课程比"02"课程成绩高的学生…...

PyTorch深度学习实战
本专栏分为两大部分,专栏内容如下: 第1部分 探讨PyTorch与其他深度学习框架的区别。 如何在PyTorch Hub中下载和运行模型。 PyTorch的基本构建组件——张量 展示不同类型的数据如何被表示为张量,以及深度学习模型期望构造什么样的张量。 梯度…...

leetcode 1011. Capacity To Ship Packages Within D Days(D天内运送包裹的容量)
数组的每个元素代表每个货物的重量,注意这个货物是有先后顺序的,先来的要先运输,所以不能改变这些元素的顺序。 要days天内把这些货物全部运输出去,问所需船的最小载重量。 思路: 数组内数字顺序不能变,就…...

支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15
目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型&a…...

Mac 上搭建 iOS WebDriverAgent 环境
文章目录Mac环境搭建配置 Xcode 生成 WDA常见问题brew 安装失败Mac环境搭建 macOS 系统电脑:12.6.2 Xcode:14.0.1(xcodebuild -version) appium Desktop:1.21.0 (下载链接) Appium Desktop 1.22.0 ,从该版…...

python学习笔记之例题篇NO.3
获得用户输入的一个整数N,输出N中所出现不同数字的和。 s list(set(list(input())))# ① r…...

【Kubernetes】第七篇 - Service 服务介绍和使用
一,前言 上一篇,通过配置一个 Deployment 对象,在内部创建副本集对象,副本集帮我们创建了 3 个 pod 副本 由于 pod 存在 IP 漂移现象,pod 的创建和重启会导致 IP 变化; 本篇,介绍 Service 服…...

Linux 终端复用器Tmux
目录 Tmux讲解 配置tmux 配置tmux会话 配置tmux窗口(在会话界面进行配置) 配置tmux面板 配置窗口共享同步 Tmux讲解 RHEL5/6/7使用的是screen软件包 RHEL8使用的是tumx软件包(功能更强大,更易用) tmux的三个基本…...

Hadoop集群模式安装(Cluster mode)
1、Hadoop源码编译 安装包、源码包下载地址 Index of /dist/hadoop/common/hadoop-3.3.0为什么要重新编译Hadoop源码? 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so|*.dll) 修改源码、重构源码 如何…...

PTA L1-054 福到了(详解)
前言:内容包括:题目,代码实现,大致思路,代码解读 题目: “福”字倒着贴,寓意“福到”。不论到底算不算民俗,本题且请你编写程序,把各种汉字倒过来输出。这里要处理的每…...

python -- 魔术方法
魔术方法就算定义在类里面的一些特殊的方法 特点:这些func的名字前面都有两个下划线 __new__方法 相当于一个类的创建一个对象的过程 __init__方法 相当于为这个类创建好的对象分配地址初始化的过程 __del__方法 一个类声明这个方法后,创建的对象如果…...

「JVM 编译优化」提前编译器
1996 年 JDK 1.0 发布,同年 7 月 外挂即时编译器发布(JDK 1.0.2),而 Java 提前编译发布在之后几个月(IBM High Performance Compiler for Java),1998 年 GNU 组织公布 GCC 家族新成员 GNU Compi…...

Golang channel 用法与实现原理
文章目录1.简介2.用法3.三种状态4.实现原理数据结构原理概述5.小结参考文献1.简介 Golang channel 是一种并发原语,用于在不同 goroutine 之间进行通信和同步。本质上,channel 是一种类型安全的 FIFO 队列,它可以实现多个 goroutine 之间的同…...

jackson 序列化、反序列化的时候第一个大写单词变成小写了(属性设置不成功)
参考链接:https://www.baeldung.com/jackson-annotations 遇到的问题 之前和第三方对接,返回的接口中的属性名称是拼音字母大写,奇怪,反序列化的时候好多字段都为空,没设置进去。 因为对接前,我先用 IntelliJ IDEA …...

如何判断机器学习数据集是否是线性的
首先,线性和非线性函数之间的区别: 左边是线性函数,右边是非线性函数。 线性函数:可以简单定义为始终遵循以下原则的函数: 输入/输出=常数。 线性方程总是1次多项式(例如x+2y+3=0)。在二维情况下,它们总是形成直线;在其他维度中,它们也可以形成平面、点或超平面。它们的…...

后端基础SQL
SQL基础语法: sql对大小写不敏感,eg: SELECT 等效于 select;select: select用于从表中查找数据,select 列名 from 表名 —> 结果集::仅有查询列的结果表; SELECT * FROM 表名称 ----> 结果集: 查找表的所有数据…...

Ubuntu 18.04 上编译和安装内核(内核源码版本)
Ubuntu 18.04 上编译和安装内核(内核源码版本) linux发行版本为,ubuntu18.04。内核版本为5.15.7。其他版本类似。 1.下载内核源代码。可以从官方网站下载最新的内核源代码,也可以使用 Git 命令从 Linux 内核的 Git 仓库中获取最新…...

day 53|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划
1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些…...

运维工程师必知的十项Linux常识
1、GNU和GPL GNU计划(又称革奴计划),是由Richard Stallman(理查德斯托曼)在1983年9月27日公开发起的软件集体协作计划。它的目标是创建一套完全的操作系统。GNU也称为软件工程项目。GPL是GNU的通用公共许可证…...

C++ 11 之右值引用和移动语义
文章目录左值引用与右值引用1、左值与右值2、纯右值、将亡值3、左值引用与右值引用4、右值引用和 std::move 使用场景引用限定符移动语义—std::move()完美转发emplace_back 减少内存拷贝和移动总结c11中引用了右值引用和移动语义,可以避免无谓的复制,提…...

【第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式)】
第一章:Spring概述、特点、IOC容器、IOC操作bean管理(基于xml方式) 1.Spring是什么? ①Spring是一款主流的java EE 轻量级开源框架。 ②广义的Spring:Spring技术栈,Spring不再是一个单纯的应用框架&#x…...

CSS变量
前端的开发工作中,CSS 是不可或缺的部分;实际工作中,我们通过JavaScript 来进行数据和交互工作,CSS 为用户呈现可视化的界面。有时,CSS 来进行部分交互效果是不是会比 JavaScript 更高效、更省事呢? 一、变…...

.net7窗口编程c#2022实战(1)-zip压缩精灵(1)
目录 创建ZIP精灵项目拖控件OpenFileDialog 类压缩与解压缩编写我们自己的代码其它参考内容创建ZIP精灵项目 VS2022中新建项目。 为窗体取一个标题名称 拖控件 左边工具栏里选择控件 拖三个按钮控件和一个listbox控件...

云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM
前言: FusionCompute架构 (CNA、VRM) CNA(ComputingNode Agent):计算节点代理VNA虚拟节点代理,部署在CNA上,实施计算、存储、网络的虚拟化的配置管理。VRM(Virtual Resource Manager):虚拟资源管理器 VNA可以省略不安装 本次实验使用的是V…...

中央一号文件首提“即时零售”,县域掀起消费业态新风潮
经过几年的探索,即时零售已经逐步走向成熟,并开始向三四线城市以及乡镇城市渗透。 过去一年,京东、美团、阿里争先布局即时零售市场,完善即时配送网络、培养用户消费习惯,即时零售订单迎来了骤增。2022年下半年&#…...

python多线程编程
Python多线程编程中常用方法: 1、join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join([timeout]) timeout:可选参数…...

小熊电器:精品与创意,走上“顶流之路”的两把“宝剑”
回顾2022年,小家电市场降温趋势明显,业绩表现整体低迷,如主打高端路线的北鼎,去年8亿元的营收出现个位数下滑,归母净利润同比下降超56%;苏泊尔营收也出现微降,归母净利润预计同比增长不到10%。而…...

如何描述元素与元素间的逻辑关系?
逻辑结构反映的是数据元素之间的关系,它们与数据元素在计算机中的存储位置无关,是数据结构在用户面前所呈现的形式。根据不同的逻辑结构来分,数据结构可分为集合、线性结构、树形结构和图形结构4种形式,接下来分别进行简要介绍。 …...

【3】linux命令每日分享——mv改名或移动
大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…...