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 cv2imgFile = "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 cv2imgFile = "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) -> Grayplt.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 cv2imgFile = "../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 cv2image_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.mzph.cn/news/700126.shtml

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

相关文章

【C++STL】STL容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

个性化纹身设计,Midjourney带你探索独一无二的艺术之美

hello,大家好&#xff0c;欢迎回来。 在当今社会&#xff0c;纹身已经变得非常常见。 在寻求与众不同的个性化纹身时&#xff0c;你是否曾经为了找不到独特的设计而苦恼&#xff1f; 现在&#xff0c;Midjourney将为你打开一扇全新的艺术之门&#xff0c;引领你探索纹身设计…

高通 Android 12 Settings不显示版本号问题

1、最近项目遇到一个奇葩问题&#xff0c;编译系统版本号不见了&#xff1f; 2、一开始我想着可能是自己代码没有make clean结果编译几个小时&#xff0c;然后烧录固件发现还是未生效。 3、然后这时候我又去看git log review最近修改也没有太大发现&#xff08;待定&#xff…

docker安装flink

docker安装flink 5.1、拉取flink镜像&#xff0c;创建网络 docker pull flink docker network create flink-network5.2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES&…

ArcgisForJS如何在线编辑ArcGIS Server发布的几何要素?

文章目录 0.引言1.ArcGIS创建几何要素2.ArcGIS Server发布几何要素3.ArcgisForJS在线编辑ArcGIS Server发布的几何要素 0.引言 ArcGIS For JS 是一种用于创建和编辑地理信息的 JavaScript 库&#xff0c;它允许用户在线编辑 ArcGIS Server 发布的几何要素。本文从ArcGIS创建几…

07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存

1. 高级映射 例如有两张表, 分别为班级表和学生表 自然, 一个班级对应多个学生 像这种数据 , 应该如果如何映射到Java的实体类上呢? 这就是高级映射解决的问题 以班级和学生为例子 , 因为一个班级对应多个学生 , 因此学生表中必定有一个班级编号字段cid 但我们在学生的实体…

Yolov9全文翻译!

Yolo v9全文翻译 论文链接&#xff1a;&#x1f47f; YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 代码链接&#xff1a;&#x1f47f; https://github.com/WongKinYiu/yolov9/tree/main 大量图片来袭&#xff01;

为什么说抖店适合电商新手入局?门槛及运营玩法,今天一文详解!

大家好&#xff0c;我是电商小布。 现在&#xff0c;越来越多的人开始加入到了电商这个行业&#xff0c;原因就是看到了它发展的可能性。 而抖音小店这个项目&#xff0c;作为近几年发展势头非常猛的电商项目&#xff0c;成为了很多小伙伴们的首选。 为什么会这样呢&#xf…

抖音数据抓取工具|视频内容提取软件

引言部分&#xff1a; 介绍针对抖音视频下载需求开发的强大工具突出解决用户获取抖音视频繁琐问题的初衷 工具功能介绍&#xff1a; 详细描述工具功能&#xff0c;包括关键词搜索、自动批量抓取、选择性批量下载等提及基于C#开发的优势以及支持通过分享链接进行单个视频抓取…

10:部署Dashboard|部署Prometheus|HPA集群

部署Dashboard&#xff5c;部署Prometheus&#xff5c;HPA集群 Dashboard部署Dashboard上传镜像到私有仓库安装服务发布服务创建管理用户查看登录的Token信息 Prometheus步骤一&#xff1a;导入所有后续需要的镜像到私有镜像仓库&#xff08;在master主机操作操作&#xff09;步…

【区块链】智能交易模式下的数据安全流通模型

【区块链】智能交易模式下的数据安全流通模型 写在最前面**区块链智能交易模式概述****数据安全流通的挑战****数据安全流通模型的核心要素****实现数据安全流通的区块链技术****区块链智能交易模式下数据安全流通模型的设计原则****数据安全流通模型的应用案例分析****面临的挑…

ONLYOFFICE8.0——赋能办公

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

IDEA 重装我都会默默的下载这些好用的插件

本文已经收录公众号&#xff1a;面汤放盐 IDEA 重装我都会默默的下载这些好用的插件 (qq.com) 这几年用得最多的插件&#xff0c;分享给大家。工欲善其事&#xff0c;必先利其器&#xff01;每一次电脑重装&#xff0c;更换工作&#xff0c;我都会默默地打开我的插件收藏单&a…

SpringBoot项目实现文件上传,MINIO+OSS阿里云

MINIO 安装以及部署 官网&#xff1a;MinIO | Code and downloads to create high performance object storage 下载后是一个minio.exe的文件&#xff0c;可以先创一个文件夹来存放数据以及文件 在文件的目录下cmd进入控制台 minio.exe server data 启动成功后控制台会打印账…

Raspbian命令行RTSP/RTP服务

Raspbian命令行RTSP/RTP服务 1. 源由2. Raspbian摄像头2.1 命令行启动RTP摄像头2.2 命令行启动RTSP摄像头 3. 示例3.1 测试RTP摄像头3.2 测试RTSP摄像头3.3 QGroundControl测试3.3.1 RTSP配置3.3.2 RTP配置 4. 总结5. 参考资料 1. 源由 鉴于实际测试发现RTP协议下&#xff0c;…

利用DevOps和ITSM的集成能促进IT技术

在当今这个快节奏和技术驱动的世界里&#xff0c;DevOps 和 IT 服务管理&#xff08;ITSM&#xff09;理念在培养心理健康和减少技术压力的工作环境中正在发挥重要作用。混合最佳实践&#xff0c;实现更好、更快、更安全的服务。 什么是DevOps&#xff1f; DevOps 专注于采用协…

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

猫头虎分享已解决Bug || ValueError: Setting an array element with a sequence.

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

python 基础知识点(蓝桥杯python科目个人复习计划49)

今日复习内容&#xff1a;做复习题 例题1&#xff1a;希尔排序 题目描述&#xff1a; 希尔排序是直接插入排序算法的一种更高效的改进版本&#xff0c;但它是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出的改进方法之一&#xff1a; 1.插入排序在对几乎已经…

C++初阶:容器适配器priority_queue常用接口详解及模拟实现、仿函数介绍

介绍完了stack和queue的介绍以及模拟的相关内容后&#xff1a;C初阶&#xff1a;容器适配器介绍、stack和queue常用接口详解及模拟实现 接下来进行priority_queue的介绍以及模拟&#xff1a; 文章目录 1.priority_queue的介绍和使用1.1priority_queue的初步介绍1.2priority_que…