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的通用公共许可证…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...

