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

news2024/10/4 14:26:06

目录

  • 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)  # 打印灰度图像的数据类型

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

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

相关文章

贪婪算法入门指南

想象一下,你在玩一款捡金币的游戏。在这个游戏里,地图中散布着各种大小不一的金币,而你的目标就是尽可能快地收集到最多的金币。你可能会采取一个直观的策略:每次都去捡最近的、看起来最大的金币。这种在每一步都采取局部最优解的…

ONLYOFFICE 桌面编辑器现已更新至v8.0啦

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

ETL:数据转换与集成的关键过程

ETL:数据转换与集成的关键过程 在现代数据驱动的世界中,有效地管理和处理数据对于企业的成功至关重要。ETL(提取、转换、加载)是一种关键的数据处理过程,有助于将数据从源系统提取、清洗、转换并加载到目标系统中&…

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

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

华为OD机试真题-虚拟游戏理财-2023年OD统一考试(C卷)---Python3--开源

题目: 考察内容: for if max 代码: """ 题目分析:投资额*回报率投资回报 要在可接受范围内选择最优的投资方式获得最大回报最多投资2个理财产品输入: 产品数int; 总投资额int; 总风险int 产品投资…

[word] 怎么把word表格里的字放在正中间? #职场发展#知识分享#知识分享

怎么把word表格里的字放在正中间? word表格中文字在中间的处理方式如下: 1、在表格中选择需要居中的文字的单元格,具体如下图。 2、全选后,鼠标在工具栏中找到:对齐方式,点击它后面的倒三角,如…

Vue学习之计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象: const author reactive({name: John Doe,books: [Vue 2 - Advan…

P1927 防护伞

题目传送门:P1927 防护伞 作业出了这道题,写一篇题解纪念一下。 这道题可以简化为“先枚举所有点,然后把这些点到另外点距离的最大距离和其他点比较,求出最小距离”。 这样说可能也听不懂,还可以再简化: …

【SpringBoot3】Spring Security 常用配置总结

注:本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例(简单使用、JWT模式) 【SpringBoot3】…

Docusaurus框架——快速搭建markdown文档站点介绍sora

文章目录 ⭐前言⭐初始化项目💖 创建项目(react-js)💖 运行项目💖 目录文件💖 创建一个jsx页面💖 创建一个md文档💖 创建一个介绍sora的文档 ⭐总结⭐结束 ⭐前言 大家好&#xff0…

智能风控体系之PagePank算法应用

PageRank算法,即网页排名算法,由Google创始人Larry Page在斯坦福上学的时候提出来的。该算法用于对网页进行排名,排名高的网页表示该网页被访问的概率高。PageRank算法计算每一个网页的PageRank值,然后根据这个值的大小对网页的重…

Linux笔记之LD_LIBRARY_PATH详解

Linux笔记之LD_LIBRARY_PATH详解 文章目录 Linux笔记之LD_LIBRARY_PATH详解1.常见使用命令来设置动态链接库路径2.LD_LIBRARY_PATH详解设置 LD_LIBRARY_PATH举例注意事项 3.替代方案使用标准路径编译时指定链接路径优先使用 rpath 还是 runpath?注意事项 1.常见使用…

高级RAG:重新排名,从原理到实现的两种主流方法

原文地址:https://pub.towardsai.net/advanced-rag-04-re-ranking-85f6ae8170b1 2024 年 2 月 14 日 重新排序在检索增强生成(RAG)过程中起着至关重要的作用。在简单的 RAG 方法中,可以检索大量上下文,但并非所有上下…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

NPM私服搭建(verdaccio)

官网地址:https://verdaccio.org/ 概述 Verdaccio 是一个流行的 Node.js 包管理器的代理工具,它允许您在本地或私有网络上轻松地创建和管理 npm 包仓库。通过 Verdaccio,开发团队可以建立自己的 npm 包仓库,以更好地控制和管理其依…

Linux:Jenkins:GitLab+Maven+Jenkins的部署

1.环境 我这里准备了三台centos7 1.用于部署gitlab 运行内存:6G 名字:Jenkins-GitLab 192.168.6.1 2.用于部署jenkins 运行内存:2G 名字:Jenkins-server 192.168.6.2 3.用于打包测试…

设计模式——三大工厂模式

工厂模式 简单工厂模式(静态工厂模式) 介绍: 1、简单工厂模式是属于创建型模式,是工厂模式的一种,**简单工厂模式是由一个工厂对象决定创建出哪种产品的实例**。是工厂模式中最简单使用的模式 2、简单工厂模式&#…

ONLYOFFICE8.0——赋能办公

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

挑战30天学完Python:Day18 正则表达式

📘 Day 18 🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点…

Python 在Word中创建表格并填入数据、图片

在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需…