当前位置: 首页 > news >正文

OpenCV-Python学习(2)—— OpenCV 图像的读取和显示

1. 学习目标

  1. 图像理解
  2. 图像读取与显示

2. 灰度图像 —— 单通道

1. 人眼中的灰度图像

在这里插入图片描述

2. 计算机中的灰度图像

[[ 72  72  71 ... 151 154 156]
 [ 75  73  69 ... 152 155 158]
 [ 78  73  66 ... 152 157 160]
 ...
 [ 94  94  94 ... 208 197 187]
 [ 92  92  93 ... 208 200 191]
 [ 96  96  97 ... 208 202 195]]

3. 彩色图像 —— 三通道

1. 人眼中的彩色图像

在这里插入图片描述

2. 计算机中彩色图像

[[[ 47  88  50]
  [ 47  88  50]
  [ 48  87  49]
  ...
  [170 150 145]
  [172 151 154]
  [174 150 162]]]

4. 读取图像 cv.imread()

1. 使用 cv.imread() 函数读取图像

import cv2 as cv

img = cv.imread(filename[,flags])

2. 参数说明

参数名参数说明
filename图像应该在工作目录或图像的完整路径应给出。
[]参数表示可选,可以不填写。(第二个参数是一个标志,它指定了读取图像的方式。)

3. 第二个参数说明

参数名参数说明
cv.IMREAD_COLOR(1)加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE(0)以灰度模式加载图像。
cv.IMREAD_UNCHANGED(-1)加载图像,包括alpha通道。

注意:除了这三个标志,你可以分别简单地传递整数1、0或-1。

4. 代码演示

  1. cv.IMREAD_COLOR(1)
import cv2
def show_image_COLOR():
  # cv2.IMREAD_COLOR
  img = cv2.imread('./images/butterfly.jpg', cv2.IMREAD_COLOR) # BGR
  print('IMREAD_COLOR',img)
  cv2.imshow('cv2.IMREAD_COLOR', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  
if __name__ == "__main__":
  show_image_COLOR()
  1. 结果
    在这里插入图片描述
  2. cv.IMREAD_GRAYSCALE(0)
import cv2
def show_image_GRAYSCALE():
  # cv2.IMREAD_GRAYSCALE
  img = cv2.imread('./images/butterfly.jpg', cv2.IMREAD_GRAYSCALE)
  print('IMREAD_GRAYSCALE',img)
  cv2.imshow('cv2.IMREAD_GRAYSCALE', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  
if __name__ == "__main__":
  show_image_GRAYSCALE()
  1. 结果
    在这里插入图片描述
  2. cv.IMREAD_UNCHANGED(-1)
import cv2
def show_image_UNCHANGED():
  # cv2.IMREAD_UNCHANGED
  img = cv2.imread('./images/butterfly.jpg', cv2.IMREAD_UNCHANGED)
  print('IMREAD_UNCHANGED',img)
  cv2.imshow('cv2.IMREAD_UNCHANGED', img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  
if __name__ == "__main__":
  show_image_UNCHANGED()
  1. 结果
    在这里插入图片描述

5. 显示图像 cv.imshow()

1. 使用函数 cv.imshow() 在窗口中显示图像

import cv2 as cv

img = cv.imread(filename[,flags])
cv.imshow(winname, mat)
cv.waitKey(0)
cv.destroyAllWindows()

2. 参数说明

参数名参数说明
winname表示窗口标题。
mat表示图像对象。

6. 键盘绑定函数 cv.waitKey()

1. cv.waitKey() 函数说明

  1. cv.waitKey() 是一个键盘绑定函数。
  2. cv.waitKey() 的参数是以毫秒为单位的时间。
  3. 如果您在这段时间内按下任何键,程序将继续运行。
  4. 如果0被传递,它将无限期地等待一次敲击键。
  5. cv.waitKey() 也可以设置为检测特定的按键。

注意:除了键盘绑定事件外,此功能还处理许多其他GUI事件,因此你必须使用它来实际显示图
像。

2. cv.waitKey() 实例

  1. cv.waitKey(0) :表示一直等待,直到任意一个键盘操作。
  2. cv.waitKey(1000) :表示等待1000毫秒即1秒。注意:在这一秒内,有任意一个键盘操作。
  3. cv.waitKey() :不加此函数,会出现闪一下。

注意:

  1. 当cv.waitKey()的值是0时,表示会一直等待,直到有任意键盘操作时,返回操作的key,继续向下执行。
  2. 如果是1000时,表示会等待1000毫秒,如果在这1000毫秒内没有任意操作,结束时返回-1,继续向下执行。
  3. 如果在这1000毫秒内,存在了任意一个键盘操作,就会立即返回操作的key,继续向下执行,不会再等待1000毫秒。

7. 销毁任何特定的窗口 cv.destroyAllWindows()

1. cv.destroyAllWindows() 函数说明

cv.destroyAllWindows()只会破坏我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函
数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。

2. 注意: 如果需要创建可以调整大小的窗口,使用 cv.namedWindow()

  1. 在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。
  2. 在这种情况下,你可以指定窗口是否可调整大小。
  3. 这是通过功能 cv.namedWindow() 完成的。
  4. 默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,
  5. 如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。

8. 保存图像 cv.imwrite()

1. 使用函数 cv.imwrite() 保存图像

import cv2 as cv

img = cv.imread(filename[,flags])
cv.imshow(winname, mat)
cv.waitKey(0)
cv.imwrite(filename, mat)
cv.destroyAllWindows()
  1. 参数说明
参数名参数说明
filename表示要保存的文件名。
mat表示要保存的图像。

9. 完整代码演示

1. 读取显示保存图片实现

  1. 以灰度模式读取图像;
  2. 显示图片;
  3. 无限期地等待一次键盘操作;
  4. 判断返回的key如果是27就直接推出,销毁窗口;
  5. key如果是s键就保存图片,销毁窗口。
def write_image():
  img = cv2.imread('./images/butterfly.jpg',0)
  cv2.imshow('image',img) 
  k = cv2.waitKey(0)
  if k == 27: # 等待ESC退出
    cv2.destroyAllWindows()
  elif k == ord('s'): # 等待关键字,保存和退出
    cv2.imwrite('butterfly.png',img)
    cv2.destroyAllWindows()

if __name__ == "__main__":
  write_image()

2. 执行结果

  1. 执行s前
    在这里插入图片描述

  2. 执行s后
    在这里插入图片描述

10. 注意

  1. OpenCV加载的彩色图像处于BGR模式。
  2. Matplotlib以RGB模式显示。
  3. 如果使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像。

相关文章:

  • Unity技术手册-初识编辑器(上)
  • 基于Java+SpringBoot+vue+elementui图书商城系统设计实现
  • 电子病历结构化之实体识别(附完整项目代码)
  • 手写Spring——bean的扫描、加载和实例化
  • 【Vue】Vue的v-if、v-if-else、v-else-if、v-show的使用
  • 【设计模式】创建型模式:单例模式
  • Sentry、Loki 轻量级日志系统部署及应用
  • Spring Boot 统一功能处理
  • qsort:我很强,了解一下(详解过程)
  • 因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)
  • 32、学习 Java 中的注解(参照官方教程)
  • 【第一部分 | HTML】1:揭露HTML的神秘面纱
  • 安装finalshell
  • 怎么找到贵人?
  • pix2pix-论文阅读笔记
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Android开源项目规范总结
  • CSS 三角实现
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6--对象的扩展
  • Iterator 和 for...of 循环
  • JavaScript实现分页效果
  • Js基础知识(四) - js运行原理与机制
  • mysql 5.6 原生Online DDL解析
  • pdf文件如何在线转换为jpg图片
  • PHP变量
  • Solarized Scheme
  • 聚类分析——Kmeans
  • 什么软件可以剪辑音乐?
  • 《天龙八部3D》Unity技术方案揭秘
  • ​iOS实时查看App运行日志
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #if #elif #endif
  • #Spring-boot高级
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (分布式缓存)Redis分片集群
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)80c52学习之旅-起始篇
  • (译) 函数式 JS #1:简介
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .Mobi域名介绍
  • .Net Winform开发笔记(一)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET多线程执行函数
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .sh
  • /etc/fstab和/etc/mtab的区别
  • @GlobalLock注解作用与原理解析
  • @JSONField或@JsonProperty注解使用
  • @property括号内属性讲解
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具