OPENCV(图像入门笔记)

使用OpenCV读取图像

使用cv.imread()函数读取图像。
第一个参数为图像名称
第二个参数是一个标志,它指定了读取图像的方式。分别有三种
cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
除了这三个标志,你可以分别简单地传递整数1、0或-1,分别对应为上面三种

import cv2
img=cv2.imread("./photos/000.png",1)  #代表为彩色图像

显示图像

使用函数cv.imshow()在窗口中显示图像。第一个参数是窗口名称,它是一个字符串。第二个参数是我们的对象。
使用函数cv2.waitKey(0)是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果0被传递,它将无限期地等待一次敲击键。
cv2.destroyAllWindows()破坏我们创建的所有窗口,清除内存。

cv2.imshow("dog",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,你可以指定窗口是否可调整大小。这是通过功能cv.namedWindow()完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。

写入图像

使用函数cv.imwrite()保存图像。
第一个参数是文件名,第二个参数是要保存的图像。 cv.imwrite(‘messigray.png’,img)
这会将图像以PNG格式保存在工作目录中。

import cv2  # 导入OpenCV库  # 读取图片,"./photos/000.png" 是图片的路径,-1 表示以原始格式读取图片(包括alpha通道)  
img = cv2.imread("./photos/000.png", -1)  # 使用cv2.imshow显示图片,"dog"是窗口的名字,img是要显示的图片  
cv2.imshow("dog", img)  # 等待键盘输入,参数0表示无限等待  
key = cv2.waitKey(0)  # 打印按下的键的ASCII码  
print(key)  # 判断是否按下了'a'键(注意这里要检查的是ASCII码)  
if key == ord('a'):  # 如果是,则关闭所有OpenCV创建的窗口  cv2.destroyAllWindows()  
# 或者判断是否按下了's'键  
elif key == ord('s'):  # 重新以灰度模式读取图片(0 表示灰度模式)  img = cv2.imread("./photos/000.png", 0)  # 将读取的图片保存到"./photos/003.png"  cv2.imwrite("./photos/003.png", img)  print("写入成功")  # 关闭所有OpenCV创建的窗口  cv2.destroyAllWindows()  # 注意:如果没有按'a'或's',窗口将保持打开状态,直到你手动关闭它。

使用Matplotlib

Matplotlib是Python的绘图库,可以使用Matplotlib缩放图像,保存图像等
OpenCV加载的彩色图像处于BGR模式。但是Matplotlib以RGB模式显示。因此,如果使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像。

#使用Matplotlib
import numpy as np
import cv2
from  matplotlib import pyplot as plt# 使用cv2.imread读取图片,'./photos/001.png'是图片的路径,0表示以灰度模式读取图片
img = cv2.imread('./photos/001.png', 0)# 使用plt.imshow显示图片
# img是要显示的图片,cmap='gray'指定使用灰度颜色映射,interpolation='bicubic'指定使用双三次插值法来平滑图像
# 双三次插值法是一种在图像处理中常用的插值方法,它可以在放大图像时提供更好的平滑效果
plt.imshow(img, cmap='gray', interpolation='bicubic')# 隐藏x轴和y轴上的刻度值
# plt.xticks([])和plt.yticks([])分别用于设置x轴和y轴的刻度标签为空列表,即不显示刻度值
plt.xticks([]), plt.yticks([])# 显示图像
# plt.show()函数会打开一个窗口,显示通过plt.imshow等函数绘制的图像
# 当调用这个函数后,程序会暂停执行,直到你关闭显示的图像窗口
plt.show()

Matplotlib与opencv展示图像区别

import cv2  # 导入OpenCV库  
from matplotlib import pyplot as plt  # 导入Matplotlib的pyplot模块用于绘图  # 使用cv2.imread读取图片,"./photos/001.png"是图片的路径,1表示以彩色模式读取图片  
img = cv2.imread("./photos/001.png", 1)  # 使用cv2.split函数将图片拆分为三个单独的颜色通道:蓝色(b)、绿色(g)、红色(r)  
b, g, r = cv2.split(img)  # 使用cv2.merge函数将颜色通道重新合并,但这次是以RGB顺序(红绿蓝),而不是原始的BGR顺序  
img2 = cv2.merge([r, g, b])  # 创建第一个子图,占据1行2列中的第1个位置  
plt.subplot(121)  
# 隐藏x轴和y轴的刻度值  
plt.xticks([]), plt.yticks([])  
# 使用plt.imshow显示原始BGR格式的图像  
plt.imshow(img)  # 创建第二个子图,占据1行2列中的第2个位置  
plt.subplot(122)  
# 隐藏x轴和y轴的刻度值  
plt.xticks([]), plt.yticks([])  
# 使用plt.imshow显示转换后的RGB格式的图像  
# 注意:在Matplotlib中,默认情况下假设图像是RGB格式的,因此这里会显示正确的颜色  
plt.imshow(img2)  # 显示所有子图  
plt.show()  # 使用cv2.imshow显示图像  
# 第一个窗口显示原始BGR格式的图像,OpenCV读取的图像默认是BGR格式的,所以这里显示的颜色是正确的  
cv2.imshow('bgr image', img)  # 第二个窗口显示转换后的RGB格式的图像,但在OpenCV中,它仍然按照BGR的顺序来解释像素值  
# 因此,尽管我们尝试以RGB顺序合并颜色通道,但OpenCV在显示时仍会将其视为BGR,导致颜色失真  
cv2.imshow('rgb image', img2)  # 等待任意键按下  
cv2.waitKey(0)  # 销毁所有OpenCV创建的窗口  
cv2.destroyAllWindows()

需要注意的是,在OpenCV中读取和保存图像时,默认的颜色顺序是BGR(蓝绿红),而不是常见的RGB(红绿蓝)。这就是为什么当你将颜色通道重新排序为RGB并使用OpenCV显示时,颜色会看起来失真的原因。Matplotlib则默认处理RGB格式的图像,因此当你使用plt.imshow()显示图像时,如果图像数据是以RGB顺序排列的,它将正确地显示颜色。

Matplotlib图像,左边为BGR 右边为RGB
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要,特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验,还能确保使用安全。因此,保证锂电池单元…

go语言Gin框架的学习路线(六)

gin的路由器 Gin 是一个用 Go (Golang) 编写的 Web 框架,以其高性能和快速路由能力而闻名。在 Gin 中,路由器是框架的核心组件之一,负责处理 HTTP 请求并将其映射到相应的处理函数上。 以下是 Gin 路由器的一些关键特性和工作原理的简要解释…

昇思25天学习打卡营第19天|LSTM+CRF序列标注

概述 序列标注指给定输入序列,给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取,包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。 条件随机场&#xff08…

水箱高低水位浮球液位开关

水箱高低水位浮球液位开关概述 水箱高低水位浮球液位开关是一种用于监测和控制水箱中液位的自动化设备,它能够在水箱液位达到预设的高低限制时,输出开关信号,以控制水泵或电磁阀的开闭,从而维持水箱液位在一个安全的范围内。这类设…

【排序算法】插入排序(希尔排序)

一.直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序法,其核心思想是对一个已经有序的序列插入一个数据,该数据依次比较有序序列中的值,直到插入到合适的位置。在我们玩扑克牌整理牌序的时候,用到的就是直接插入排序的…

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话!给个点赞和评论支持下吧,感谢~ 作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

28行代码完成深度学习模型——线性模型 01

在这里插入代码片## 线性模型 机器学习中的线性模型是一种预测模型,它基于线性关系来预测输出值。这种模型假设输入特征(自变量)和输出(因变量)之间存在线性关系。线性模型通常具有以下形式: y x*w b 其…

【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁

文章目录 基于ATmega16的数码管独立按键密码锁设计实验报告实验背景硬件介绍主要元器件电路连接 设计原理硬件设计软件设计 程序原理延时函数独立按键检测密码显示主函数 资源代码 基于ATmega16的数码管独立按键密码锁设计实验报告 实验背景 本实验旨在设计并实现一个基于ATm…

数据库系统原理练习 | 作业1-第1章绪论(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业,以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方,欢迎各位斧正。 专业课本: 目录 一、选择题 二:简答题 三:综合题 一、选择…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

昇思MindSpore学习笔记5-01生成式--LSTM+CRF序列标注

摘要&#xff1a; 记录昇思MindSpore AI框架使用LSTMCRF模型分词标注的步骤和方法。包括环境准备、score计算、Normalizer计算、Viterbi算法、CRF组合,以及改进的双向LSTMCRF模型。 一、概念 1.序列标注 标注标签输入序列中的每个Token 用于抽取文本信息 分词(Word Segment…

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃

InetAddress.getLocalHost().getHostAddress()阻塞导致整个微服务崩溃 import java.net.InetAddress;public class GetHostIp {public static void main(String[] args) {try {long start System.currentTimeMillis();String ipAddress InetAddress.getLocalHost().getHostA…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Docker 容器网络及其配置说明

Docker 容器网络及其配置说明 docker容器网络docker的4种网络模式bridge 模式container模式host 模式none 模式应用场景 docker 容器网络配置Linux 内核实现名称空间的创建创建 Network Namespace操作 Network Namespace 转移设备veth pair创建 veth pair实现 Network Namespac…

三、docker配置阿里云镜像仓库并配置docker代理

一、配置阿里云镜像仓库 1. 登录阿里云官网&#xff0c;并登录 https://www.aliyun.com/ 2. 点击产品 - 容器 - 容器与镜像服务ACR - 管理控制台 - 镜像工具 - 镜像加速器 二、配置docker代理 #1. 创建docker相关的systemd文件 mkdir -p /etc/systemd/system/docker.servic…

SQLite 嵌入式数据库

目录&#xff1a; 一、SQLite 简介二、SQLite 数据库安装1、安装方式一&#xff1a;2、安装方式二&#xff1a; 三、SQLite 的命令用法1、创建、打开、退出数据库&#xff1a;2、编辑数据库&#xff1a; 四、SQLite 的编程操作1、打开 / 创建数据库的 C 接口&#xff1a;2、操作…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【数据结构/操作系统 堆和栈】区别及应用场景、底层原理图解

堆和栈 比较有趣的是&#xff0c;计算机网络、操作系统中都会对堆栈有不同方面比较详细的描述&#xff0c;而使用的地方通常对这些底层的细节表现得没有那么明显。 但如果你能了解堆栈在计算机网络和操作系统中的表现形式&#xff0c;在你写代码时就会有不一样的认识&#xff…

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…