OpenCV 4基础篇| OpenCV图像基本操作

目录

  • 1. 图像读取
    • 1.1 cv2.imread() 不能读取中文路径和中文名称
    • 1.2 cv2.imdecode() 可以读取中文路径和中文名称
  • 2. 图像的显示
    • 2.1 openCV显示图像 cv2.imshow()
    • 2.2 matplotlib显示图像 plt.imshow()
  • 3. 图像的保存 cv2.imwrite()
  • 4. 图像的复制
    • 4.1 img.copy()
    • 4.2 np.copy()
    • 4.3 代码示例
  • 5. 图像的属性

1. 图像读取

1.1 cv2.imread() 不能读取中文路径和中文名称

语法结构:

retval = cv.imread(filename[, flags]) #用于从指定的文件读取图像
  • filename:读取图像的文件路径和文件名
  • flags:读取图片的方式,可选项:
    • cv2.IMREAD_COLOR(1):始终将图像转换为 3 通道BGR彩色图像,默认方式
    • cv2.IMREAD_GRAYSCALE(0):始终将图像转换为单通道灰度图像
    • cv2.IMREAD_UNCHANGED(-1):按原样返回加载的图像(使用Alpha通道)
    • cv2.IMREAD_ANYDEPTH(2):在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位
    • cv2.IMREAD_ANYCOLOR(4):以任何可能的颜色格式读取图像
  • retval:读取的 OpenCV 图像,nparray 多维数组

注意事项:

  • OpenCV 读取图像文件,返回值是一个nparray 多维数组。OpenCV 对图像的任何操作,本质上就是对 Numpy 多维数组的运算。
  • OpenCV 中彩色图像使用 BGR 格式,而 PIL、PyQt、matplotlib 等库使用的是 RGB 格式。
  • cv2.imread() 如果无法从指定文件读取图像,并不会报错,而是数返回一个空矩阵。
  • cv2.imread() 指定图片的存储路径和文件名,在 python 中不支持中文和空格(但并不会报错)。必须使用中文时,可以使用 cv2.imdecode() 处理。
  • cv2.imread() 读取图像时默认忽略透明通道,但可以使用 CV_LOAD_IMAGE_UNCHANGED 参数读取透明通道。
  • 对于彩色图像,可以使用 flags=0 按照读取为灰度图像。

1.2 cv2.imdecode() 可以读取中文路径和中文名称

语法结构:

retval = cv2.imdecode(buf, flags) #用于从内存中读取图像
  • buf:字节数组,其中包含要解码的图像数据。
  • flags:读取图片的方式,可选项:
    • cv2.IMREAD_COLOR(1):始终将图像转换为 3 通道BGR彩色图像,默认方式
    • cv2.IMREAD_GRAYSCALE(0):始终将图像转换为单通道灰度图像
    • cv2.IMREAD_UNCHANGED(-1):按原样返回加载的图像(使用Alpha通道)
    • cv2.IMREAD_ANYDEPTH(2):在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位
    • cv2.IMREAD_ANYCOLOR(4):以任何可能的颜色格式读取图像
  • retval:读取的 OpenCV 图像,nparray 多维数组

注意事项:

  • 确保传递给 cv2.imdecode() 的缓冲区包含有效的图像数据,并且使用正确的标志来解码图像。如果缓冲区为空或损坏,或者使用了错误的标志,函数将无法正确解码图像。
  • cv2.imdecode() 返回的是一个 NumPy 数组,该数组存储了解码后的图像数据。这个数组是存储在内存中的,因此在处理大量图像或非常大的图像时,需要注意内存使用情况,避免内存溢出或内存不足的问题。

代码示例:

import numpy as np
import cv2

imgFile = "img/测试图.png"  # 带有中文的文件路径和文件名
# 使用 imdecode 可以读取带有中文的文件路径和文件名
img = cv2.imdecode(np.fromfile(imgFile, dtype=np.uint8), -1)
cv2.imshow("demo", img)
cv2.waitKey()
cv2.destroyAllWindows()

2. 图像的显示

2.1 openCV显示图像 cv2.imshow()

语法结构:

 cv2.imshow(winname,mat) #用于在窗口中显示图像
  • winname:用于标识要显示的窗口。如果指定的窗口名称已经存在,cv2.imshow() 将在这个现有窗口中显示图像。如果不存在,它将创建一个新窗口。
  • mat:所显示的 OpenCV 图像,nparray 多维数组。

注意事项:

  • cv2.imshow() 会自动调整窗口大小以适应图像的尺寸。如果需要手动设置窗口大小,可以使用 cv2.namedWindow() 函数,并指定窗口的大小。
  • cv2.imshow() 之后要用 waitKey() 函数设定图像窗口的显示时长,否则不会显示图像窗口,waitKey(0) 表示窗口显示时长为无限。
  • 可以创建多个不同的显示窗口,每个窗口必须命名不同的 filename。
  • 可以用 destroyWindow() 函数关闭指定的显示窗口,也可以用 destroyAllWindows() 函数关闭所有的显示窗口。

2.2 matplotlib显示图像 plt.imshow()

语法结构:

plt.imshow(img[, cmap])
  • img:图像数据,一个二维或三维数组,通常表示图像的像素值。对于灰度图像,它是一个二维数组,其中每个值表示一个像素的亮度。对于彩色图像,它是一个三维数组,通常的形状是 (height, width, 3) 或 (height, width, 4),其中 3 或 4 分别表示 RGB(红、绿、蓝)或 RGBA(红、绿、蓝、透明度)颜色通道.
  • cmap:颜色图谱(colormap),默认为 RGB(A) 颜色空间
    • gray:灰度显示
    • hsv:hsv 颜色空间

注意事项:

  • plt.imshow() 可以直接显示 OpenCV 灰度图像,不需要格式转换,但需要使用 cmap=‘gray’ 进行参数设置。
  • plt.imshow() 可以使用 matplotlib 库中的各种方法绘图,如标题、坐标轴、插值等
  • plt.imshow() 只是将图像显示在当前的 Matplotlib 图形上。要实际看到图像,你需要调用 plt.show()。如果你想要保存图像到文件,可以使用 plt.savefig() 函数。
  • 在 Matplotlib 中,图像的默认原点(即坐标 (0,0))通常位于左上角,这与许多图像处理库(如 OpenCV)中的默认设置(左下角为原点)不同。这可能在处理或显示图像时造成混淆。
  • 在使用 plt.imshow() 或其他 Matplotlib 函数显示图形后,如果你不再需要它,最好使用 plt.close() 来关闭图形,以释放资源。

代码示例:

from matplotlib import pyplot as plt
import cv2

imgFile = "img/1.png"  # 带有中文的文件路径和文件名
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)

imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)  # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)  # 图片格式转换:BGR(OpenCV) -> Gray

plt.rcParams['font.sans-serif'] = ['FangSong']  # 支持中文标签
plt.subplot(221), plt.title("1. RGB 格式(mpl)"), plt.axis('off')
plt.imshow(imgRGB)  # matplotlib 显示彩色图像(RGB格式)
plt.subplot(222), plt.title("2. BGR 格式(OpenCV)"), plt.axis('off')
plt.imshow(img1)  # matplotlib 显示彩色图像(BGR格式)
plt.subplot(223), plt.title("3. 设置 Gray 参数"), plt.axis('off')
plt.imshow(img2, cmap='gray')  # matplotlib 显示灰度图像,设置 Gray 参数
plt.subplot(224), plt.title("4. 未设置 Gray 参数"), plt.axis('off')
plt.imshow(img2)  # matplotlib 显示灰度图像,未设置 Gray 参数
plt.show()

在这里插入图片描述

3. 图像的保存 cv2.imwrite()

语法结构:

retval = cv2.imwrite(filename, img [, params])
  • filename:要保存的文件的路径和名称,包括文件扩展名
  • img:要保存的 OpenCV 图像,nparray 多维数组
  • params:不同编码格式的参数
    • cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
    • cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
    • cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
  • retval:返回值,保存成功返回 True,否则返回 False。

注意事项:

  • 文件名和扩展名决定了图像的格式。例如,如果文件名为 ‘image.jpg’,则图像将以 JPEG 格式保存。
  • 在 Python 3 中,cv2.imwrite() 不支持中文和空格作为文件名。如果需要使用中文,可以使用 cv2.imencode() 函数进行处理。
  • cv2.imwrite() 函数的返回值是一个布尔值,表示图像是否成功保存。
  • 对 4 通道 BGRA 图像,可以使用 Alpha 通道保存为 PNG 图像。

代码示例:

import cv2

imgFile = "../img/1.png"  # 读取文件的路径
img = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
# 保存 JPEG 图像并指定质量为 90
cv2.imwrite('output.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
# 保存 PNG 图像并指定压缩级别为 9
cv2.imwrite('output.png', img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

4. 图像的复制

4.1 img.copy()

  • img.copy() 是NumPy数组的一个方法。当你在一个NumPy数组(通常是OpenCV图像)上调用这个方法时,它会创建一个新的数组,这个新数组是原始数组的一个深拷贝(deep copy)。这意味着新数组和原始数组在内存中是独立的,对其中一个数组的任何修改都不会影响另一个数组。

4.2 np.copy()

  • img.copy()是NumPy数组的一个方法。当你在一个NumPy数组(通常是OpenCV图像)上调用这个方法时,它会创建一个np.copy(img) 是NumPy库的一个函数,它也可以用来创建数组的一个深拷贝。与 img.copy() 类似,np.copy(img) 会创建一个新的数组,这个新数组与原始数组 img 在内存中是独立的。

4.3 代码示例

import cv2  
import numpy as np  
  
# 读取图像  
img = cv2.imread('input.jpg')  
  
# 使用img.copy()方法复制图像  
img_copy1 = img.copy()  
  
# 使用np.copy()函数复制图像  
img_copy2 = np.copy(img)  
  
# 现在img_copy1和img_copy2都是img的副本

5. 图像的属性

  • 在OpenCV中,经常需要获取图像的大小,类型,像素等图像属性,为此,提供了shape、size、dtype这3个常用函数:
    • shape: shape是一个包含图像高度、宽度和通道数的元组。可以通过shape属性获取图像的尺寸。
      如果图像是灰度图,返回值就仅有 行数和列数,所以通过检查这个返回值就可以知道加载的是灰度图还是彩色图。
    • size: 返回图像的像素数目。
    • dtype: 返回的是图像的数据类型。

代码示例:

import cv2

image_Color = cv2.imread("log.jpg")  # 读取log.jpg
print("获取彩色图像的属性:")
print("shape =", image_Color.shape)  # 打印彩色图像的(像素行数,像素列数,通道数)
print("size =", image_Color.size)  # 打印彩色图像包含的像素个数
print("dtype =", image_Color.dtype)  # 打印彩色图像的数据类型
image_Gray = cv2.imread("log.jpg", 0)  # 读取与log.jpg(彩色图像)对应的灰度图像
print("获取灰度图像的属性:")
print("shape =", image_Gray.shape)  # 打印灰度图像的(像素行数,像素列数)
print("size =", image_Gray.size)  # 打印灰度图像包含的像素个数
print("dtype =", image_Gray.dtype)  # 打印灰度图像的数据类型

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java springboot的图书管理系统设计和实现

基于java springboot的图书管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

Ansible 简介及部署 基础模块学习 ansible部署rsync 及时监控远程同步

Ansible介绍: Ansible 是一个配置管理系统,当下最流行的批量自动化运维工具之一,它是一款开源的自动化工具,基于Python开发的配置管理和应用部署的工具。 Ansible 是基于模块工作的,它只是提供了一种运行框架&#xff…

【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

书生·浦语大模型实战营第四节课作业

基础作业 fintune过程 这里要注意下。 合并完参数的模型再进行网页部署时,需要用到InternLM源码,教程里面忽略了需要commit版本。通过以下命令转到所需版本,然后就可以看到web_demo.py。 cd InternLM git checkout 3028f07cb79e5b1d7342f4…

Servlet实现图片的上传和显示

本篇文章是在上一篇文章上改进而来 一、图片上传需要引用的jar包 链接:https://pan.baidu.com/s/17FLjlWlNEG5YnS_dl3C8WA 提取码:wbis 二、最后的结果 三、更改数据库增加图片路径字段path 四、前端页面增加图片上传按钮,和上传的复选框 代码 上传…

ChatGPT 4.0 升级指南

1.ChatGPT 是什么? ChatGPT 是由 OpenAI 开发的一种基于人工智能的聊天机器人,它基于强大的语言处理模型 GPT(Generative Pre-trained Transformer)构建。它能够理解人类语言,可以为我们解决实际的问题。 1.模型规模…

vue+node.js美食分享推荐管理系统 io551

,本系统采用了 MySQL数据库的架构,在开始这项工作前,首先要设计好要用到的数据库表。该系统的使用者有二类:管理员和用户,主要功能包括个人信息修改,用户、美食类型、美食信息、订单信息、美食分享、课程大…

Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案

文章目录 1、问题描述2、原因分析3、解决方案3.1、方案一:降低mysql版本3.2、方案二:增加nullCatalogMeansCurrent参数(推荐) 4、总结 1、问题描述 需要在docker中,部署Camunda流程引擎。通过启动脚本camunda-platfor…

【LeetCode-337】打家劫舍III(动态规划)

目录 题目描述 解法1:动态规划 代码实现 题目链接 题目描述 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“…

JVM内存随着服务器内存的升高而升高问题排查

一、故障描述 公司测试环境和线上环境,都会有:JVM内存随着服务器内存的升高而升高 这种问题 二、排查 1、linux服务器上使用htop查看java项目内存占比,给最大最小推内存300m,但是实际上超出一倍 2、排查方案 a、通过后面的学习…

Games 103 作业四

Games 103 作业四 第四次作业就是流体模拟了,作业中给了若干的实现步骤,以及一些模板代码。 首先第一步,在update函数的开头,加载水面mesh的高度,然后在update的结束时,把计算后的高度更新到mesh中。这个很…

CSDN原力值怎么提升?

文章目录 前言一、原力值怎么看二、提升原力值的方法1.原力值↑2.原力值↓提示!!!禁止在csdn网站内进行违规行为!!! 结束语 前言 在前面一篇文章中,我讲了付费收看的条件,有需要的先把网址收藏起来! https://blog.csdn.net/m0_69481332/arti…

【坑】Spring Boot整合MyBatis,一级缓存失效

一、Spring Boot整合MyBatis,一级缓存失效 1.1、概述 MyBatis一级缓存的作用域是同一个SqlSession,在同一个SqlSession中执行两次相同的查询,第一次执行完毕后,Mybatis会将查询到的数据缓存起来(缓存到内存中&#xf…

【Java面试系列】Nginx

目录 为什么要用Nginx?为什么Nginx性能这么高?Nginx 是如何实现高并发的? Nginx怎么处理请求的?Nginx的工作流程 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日…

前沿科技速递——YOLOv9

随着YOLO系列的不断迭代更新,前几天,YOLO系列也迎来了第九个大型号的更新!YOLOv9正式推出了!附上原论文链接。 arxiv.org/pdf/2402.13616.pdf 同样是使用MS COCO数据集进行对比比较,通过折线图可看出AP曲线在全方面都…

2024比较赚钱的项目是什么?亲身经历,月入过万!

我是电商珠珠 年后找项目这件事,成为了部分人所焦虑的一点,有的想要兼职,有的在考虑全职。至于做什么还没有一丝头绪。大家都知道短视频很火,于是有直播能力的人就吃上了流量红利,开始做达人带货,拍视频接…

Linux下“一切皆文件”

“Linux下一切皆文件” Linux 下一切皆文件这个说法是指 Linux 系统中的一种设计理念,即将所有设备、资源和进程等抽象为文件或文件夹的形式。这种设计理念的好处在于统一了对待不同类型资源的方式,提供了统一的接口和工具来进行管理和操作。 Linux 下…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点,thumbShape默认样式是RoundSliderThumbShape,如果想要使用其它的样式就需要自定义一下thumbShape; 例如需要一个上图样式的(圆点半透明圆形边框&#xff09…

freeswitch 权威指南 --- 高级篇

官网文档:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程:https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》:目录:https://juejin.cn/post/702058079…

2024全国水科技大会暨流域水环境治理与水生态修复论坛(六)

论坛召集人 冯慧娟 中国环境科学研究院流域中心研究员 刘 春 河北科技大学环境与工程学院院长、教授 一、会议背景 为深入贯彻“山水林田湖是一个生命共同体”的重要指示精神,大力实施生态优先绿色发展战略,积极践行人、水、自然和谐共生理念&…