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的通用公共许可证…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

