OPENCV(图像入门笔记)

news2024/11/19 3:32:22

使用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.coloradmin.cn/o/1900032.html

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

相关文章

武汉免费 【FPGA实战训练】 Vivado入门与设计师资课程

一.背景介绍 当今高度数字化和智能化的工业领域,对高效、灵活且可靠的技术解决方案的需求日益迫切。随着工业 4.0 时代的到来,工业生产过程正经历着前所未有的变革,从传统的机械化、自动化逐步迈向智能化和信息化。在这一背景下&…

windows USB 设备驱动开发-控制传输的数据包

每次在主机控制器和 USB 设备之间移动数据时,都会发生传输。 通常,USB 传输可大致分为控制传输和数据传输。 所有 USB 设备都必须支持控制传输,并且可以支持用于数据传输的端点。 每种类型的传输都与设备缓冲区USB 端点 的类型相关联。 控制传…

vscode远程连接linux(配置免密)

远程连接 1.首先保证物理机和虚拟机网络可以ping通 2.查看ubuntu得ip地址 ifconfig IP为:192.168.52.133 3.连接远程主机 配置免密 1.打开cmd运行ssh-keygen -t rsa 一路回车就行 2.打开window文件夹C:\Users\xbj\.ssh 3.用记事本打开id_rsa.pub文件复制公…

没有tpm2.0,你就不打算升级win11?屁孩君小白式教学如何跳过

屁孩君终于回归了,回归首文 博主的姥爷电脑已用此方法成功 目录 屁孩君终于回归了,回归首文下载win11镜像将镜像进行提取删除检测文件断网,防止windows重新补全检测文件点击setup,进行检测安装 完成屁孩君终于回归了,记…

idea使用技巧---超实用的mybatisX插件

一、使用原因 传统创建mybatis项目之后,在mapper接口和xml映射文件之间手动切换非常麻烦:不仅需要记住文件的所在位置,而且每次在mapper当中添加一个新的接口,都需要单独手动点开xml再编写sql; eg:在item…

CSS中 实现四角边框效果

效果图 关键代码 border-radius:10rpx ;background: linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) left bottom,linear-gradient(…

多模态MLLM都是怎么实现的(11)--从SadTalker到快手LivePortait

我之前出差带休假差不多两个礼拜吧,今天回北京更新一篇 我确实找到了一个有意思的东西,LivePortrait 这东西开源了,你可以认为是目前做得最好的"Sadtalker",国内也有dream-talker,EMO之类的。 我之前看EMO的…

Spring Boot集成olingo快速入门demo

1.什么是olingo? Apache Olingo 是个 Java 库,用来实现 Open Data Protocol (OData)。 Apache Olingo 包括服务客户端和 OData 服务器方面。 Open Data Protocol (开放数据协议,OData) 是用来查询和更新数据的一种W…

不要再盲目入场啦!跨境电商入场第一步!先收集整理这些数据,看清自己该如何入场!【纯分享】

23年、24年确实无愧于“品牌出海元年”的称号,23年出海四小龙——速卖通、TikTokshop、Temu、Shein在海外的爆发让大家看到了海外市场的活动;而24年则有更多的国内品牌将目光瞄向了海外市场,年后开工到今天基本上每天都有客户来咨询出海相关的…

Java应用系统设计与实现--学生信息管理系统(附解决方案源码)

一、实验目的及要求 1.1实验目的 掌握Java GUI编程技术,了解Swing框架的使用。 掌握MySQL数据库的基本操作,了解如何在Java中连接和操作数据库。 掌握用户权限管理的基本概念和实现方法。 提升综合运用所学知识设计和实现一个完整应用系统的能力…

hid-ft260驱动学习笔记 1 - 驱动模块注册与注销

目录 1. ft260_driver_init初始化 1.1 tty设备 1.1.1 申请tty驱动设备 1.1.2 初始化tty驱动程序 1.1.3 注册tty设备 1.2 hid设备 2. ft260_driver_exit注销模块 3. 调试 hid-ft260.c的最底部可以看到该驱动的注册与注销接口的申明。 module_init(ft260_driver_init); …

Nifi脚本组件ExecuteScript 的使用(一)

ExecuteScript 组件的基本使用 前面已经介绍过Nifi中基本的数据流程,这里介绍一下最为常用的一个组件,ExecuteScript processor,顾名思义ExecuteScript组件是一组以自定义脚本为主体的组件,意思就是,可以在该组件内部…

如何使用特殊的参数和符号来改变图像的风格、质量、比例

🪂🌹 /imagine prompt: 一朵白色的花,透明的花瓣,深如海水,晶莹剔透+露珠,8K,HD,常春藤,花卉,热带植物 --v 5 --ar 2:1 --c 80 --s 500 -v 5切换模型版本5--ar 2:1宽高比例为2:1--c 80混沌值为80--s 500样式值为500🧑🏼‍🎨Midjourney 动漫和插画风格 🌹…

Java视频点播网站

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

Redis的八种数据类型介绍

Redis 是一个高性能的键值存储,它支持多种丰富的数据类型。每种数据类型都有其特定的用途和底层实现。下面我将介绍 Redis 支持的主要数据类型及其背后的数据结构。 本人这里还有几篇详细的Redis用法文章,可以用来进阶康康! 1. 字符串 (Stri…

Python数据分析-分子数据分析和预测

一、设计背景 分子结构设计与性质计算对研发新型高能量密度材料具有重要意义。机器学习作为一种大数据计算模型,可以避免复杂、危险的实验,大幅提高研发效率、降低设计和计算成本。本文基于机器学习的方法以及通过构建神经网络,实现对高能量…

网络基础:IS-IS协议

IS-IS(Intermediate System to Intermediate System)是一种链路状态路由协议,最初由 ISO(International Organization for Standardization)为 CLNS(Connectionless Network Service)网络设计。…

TP8/6 子域名绑定应用

原www.xxx.com/admin改为admincms.xxx.com config/app.php 官方文档:ThinkPHP官方手册

fastadmin 如何给页面添加水印

偶然发现fastadmin框架有个水印插件&#xff0c;看起来漂亮&#xff0c;就想也实现这样的功能&#xff0c;看到需要费用。但是现成的插件需要费用&#xff0c;自己动手丰衣足食。说干就干。 1. 找到watermark.js &#xff0c;放到assets/js/ 下面 2.具体页面引入 <script…

基于单片机的粉尘检测报警防护系统研究

摘要 &#xff1a; 粉尘检测是环境保护的重要环节&#xff0c;传统的粉尘检测防护系统的预防方式较为单一。本文设计了一种基于单片机的粉尘检测报警防护系统&#xff0c;能有效地检测粉尘浓度&#xff0c;进行多种方式的报警防护&#xff0c;以保证工作人员的生命健康和安全。…