【计算机视觉】图像基本操作

1. 数字图像表示

  • 一幅尺寸为M·N的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵M·N·3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度,取值范围[0,255]

  • 在这里插入图片描述

    图像数据按照自左向右、自上向下的顺序存储在计算机内存中,坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。

    在OpenCV中,RGB彩色图像的通道顺序为BGR。

2. 图像文件的读写与显示

2.1 图像文件的读取

cv2.imread() 是 OpenCV 中用于从文件中读取图像的函数。它支持多种图像格式(如 JPEG、PNG、BMP 等),并将图像读取为 NumPy 数组。

cv2.imread(filename, flags=cv2.IMREAD_COLOR)
参数说明
  1. filename (str):

    • 图像文件的路径,可以是相对路径或绝对路径。
    • 如果路径无效或者文件不存在,cv2.imread() 会返回 None
  2. flags (int, 可选):

    • 控制图像的读取方式,默认值为 cv2.IMREAD_COLOR

    常见取值包括:

    • cv2.IMREAD_COLOR (1): 以彩色模式加载图像,忽略图像的透明通道。如果图像是灰度图,会将其转换为 BGR(3 通道)。
    • cv2.IMREAD_GRAYSCALE (0): 以灰度模式加载图像,返回单通道(8 位深度)。
    • cv2.IMREAD_UNCHANGED (-1): 读取图像的原始数据,包括透明通道(若存在)。
    • cv2.IMREAD_ANYCOLOR: 读取为彩色图像,但会自动适配图像格式。
    • cv2.IMREAD_ANYDEPTH: 以原始位深(16 位或 32 位浮点)加载图像,而不是默认的 8 位。
返回值
  • 成功时,返回一个 NumPy 数组,表示图像的像素数据。
    • 彩色图像的形状为 (height, width, 3)(BGR 格式)。
    • 灰度图像的形状为 (height, width)
  • 失败时,返回 None,通常是因为文件不存在或路径不正确。

2.2 图像文件的显示

cv2.imshow() 是 OpenCV 中用于显示图像的函数,它会在一个窗口中显示加载或处理后的图像。

cv2.imshow(winname, mat)
参数说明
  1. winname (str):

    • 窗口的名称,可以是任意字符串。
    • 如果指定的窗口名称不存在,会自动创建一个窗口并显示图像。
    • 多次调用时,若窗口名称相同,则会在同一个窗口内更新显示内容。
  2. mat (ndarray):

    • 要显示的图像数据,通常是由 cv2.imread() 或其他 OpenCV 图像处理函数生成的 NumPy 数组。
    • 支持以下几种格式:
      • 彩色图像:形状为 (height, width, 3),默认 BGR 格式。
      • 灰度图像:形状为 (height, width)
      • 深度或透明通道图像在某些情况下可能需要预处理以适配。
特性
  • 图像显示的窗口会保持阻塞,直到用户按键关闭窗口(通常需要配合 cv2.waitKey() 使用)。
  • 窗口默认大小与图像大小一致,但可以通过 cv2.resizeWindow() 调整大小。
其他相关函数
  1. cv2.waitKey(delay)

    • 用于捕获键盘事件。
    • 参数 delay 是等待的时间,单位为毫秒。
      • 如果为 0,程序会无限等待键盘输入。
      • 如果为正整数,则会等待指定时间。
    • 返回值是按键的 ASCII 码(例如 27 对应 ESC 键)。

    示例:

    key = cv2.waitKey(0)
    if key == 27:  # 按 ESC 键关闭
        cv2.destroyAllWindows()
    
  2. cv2.destroyWindow(winname)cv2.destroyAllWindows()

    • cv2.destroyWindow(winname):关闭特定名称的窗口。
    • cv2.destroyAllWindows():关闭所有 OpenCV 创建的窗口。
  3. cv2.namedWindow(winname, flags)

    • 用于创建窗口并设置属性。
    • 示例:
      cv2.namedWindow('Resizable Window', cv2.WINDOW_NORMAL)
      cv2.imshow('Resizable Window', image)
      cv2.waitKey(0)
      
  4. cv2.resizeWindow(winname, width, height)

    • 调整窗口大小(需配合 cv2.WINDOW_NORMAL 使用)。
    • 示例:
      cv2.namedWindow('Resizable Window', cv2.WINDOW_NORMAL)
      cv2.resizeWindow('Resizable Window', 800, 600)
      cv2.imshow('Resizable Window', image)
      cv2.waitKey(0)
      

2.3 图像文件的写入

cv2.imwrite() 是 OpenCV 中用于将图像保存到文件的函数,可以将处理后的图像数据以指定格式保存到磁盘。

cv2.imwrite(filename, img, params=None)
参数说明
  1. filename (str):

    • 保存图像的完整路径,包括文件名和扩展名。
    • 扩展名决定保存图像的格式(例如 .jpg, .png, .bmp, .tiff 等)。
    • 示例:'output.jpg''/path/to/output.png'
  2. img (ndarray):

    • 要保存的图像数据,通常是一个 NumPy 数组。
    • 格式可以是:
      • 彩色图像:形状为 (height, width, 3),数据类型为 uint8
      • 灰度图像:形状为 (height, width),数据类型为 uint8
  3. params (list, 可选):

    • 图像格式的参数,取决于文件格式。例如,可以指定 JPEG 的压缩质量或 PNG 的压缩级别。
    • 常见参数:
      • 对于 JPEG (.jpg):
        • [cv2.IMWRITE_JPEG_QUALITY, quality]quality 是压缩质量(0-100),默认值为 95,值越高质量越好。
      • 对于 PNG (.png):
        • [cv2.IMWRITE_PNG_COMPRESSION, compression]compression 是压缩级别(0-9),默认值为 3,值越高压缩越强但速度越慢。
      • 对于 WebP (.webp):
        • [cv2.IMWRITE_WEBP_QUALITY, quality]quality 是压缩质量(0-100)。
返回值
  • 返回值为布尔值 (TrueFalse):
    • True: 保存成功。
    • False: 保存失败(如路径无效或无写权限)。

3 视频文件的读写与显示

对于图像文件,可以从其扩展名得知图像的格式,但是并不适用于视频文件,因为视频文件的格式主要由压缩算法决定;压缩算法称为编码器,解压算法成为解码器,编解码算法称为编解码器。
编解码器种类很多,主要由MJPG、XVID、DIVX等等。

3.1 视频读取

cv2.VideoCapture() 是 OpenCV 用于视频捕获和处理的函数,可以从视频文件、摄像头或视频流中获取帧数据。

cv2.VideoCapture(index, apiPreference=None)
参数说明
  1. index:

    • 如果要从摄像头捕获,index 是摄像头设备的编号。
      • 通常,0 代表默认摄像头,1 代表外接摄像头(如果有)。
    • 如果要从文件读取,index 是视频文件的路径(如 'video.mp4')。
  2. apiPreference (可选):

    • 指定视频捕获后端(API)的优先级,默认为 cv2.CAP_ANY,OpenCV 会自动选择适当的后端。
    • 常见的后端值:
      • cv2.CAP_ANY:自动选择(默认)。
      • cv2.CAP_V4L2:用于 Linux 的 V4L2 接口。
      • cv2.CAP_DSHOW:DirectShow(Windows)。
      • cv2.CAP_MSMF:Windows Media Foundation。
      • cv2.CAP_FFMPEG:FFmpeg(跨平台,支持大部分格式)。
返回值
  • 返回一个 cv2.VideoCapture 对象,通过该对象可以捕获视频帧。

3.2 视频写入

cv2.VideoWriter() 是 OpenCV 用于将视频帧保存为视频文件的函数。通过这个函数,您可以将处理后的图像帧编码为视频并存储到磁盘。

cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)
参数说明
  1. filename (str):

    • 视频输出文件的路径,包括文件名和扩展名。
    • 扩展名决定了视频的编码格式(如 .avi, .mp4, .mkv 等)。
  2. fourcc (int):

    • 表示视频编码器的 4 字符代码 (FourCC)。
    • 使用 cv2.VideoWriter_fourcc() 函数生成,例如:
      • cv2.VideoWriter_fourcc(*'XVID'):XVID 编解码器(常用于 .avi 格式)。
      • cv2.VideoWriter_fourcc(*'MP4V'):MP4 编解码器(常用于 .mp4 格式)。
      • cv2.VideoWriter_fourcc(*'H264'):H.264 编解码器(适用于高效压缩)。
    • 不同系统和平台可能支持的编码器不同。
  3. fps (float):

    • 视频的帧率,即每秒的帧数。
    • 例如,30.0 表示 30 帧/秒。
  4. frameSize (tuple):

    • 视频帧的宽度和高度,格式为 (width, height)
    • 所有传入帧的大小必须与此一致,否则会抛出错误。
  5. isColor (bool):

    • 指定视频是否为彩色。
    • 默认为 True(彩色),如果为 False,表示灰度视频。
返回值
  • 返回一个 cv2.VideoWriter 对象,用于写入视频。

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

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

相关文章

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述:文本对旋转验证码进行了突破及讲述了实现原理,代码使用纯算法 OpenCV,使用代价较小同时不用安装一大堆AI训练相关的模组,方便且能够快速上手 当前亲自验证了能够支持的网站:国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下,其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序列预测; 3.递归预测未来数据,可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍: Blender下载: Blender改进功能: Blender介绍: Blender是一款开源的跨平台全能三维动画制作软件,提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

网络原理(一)—— http

什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

典型组合逻辑电路设计

目录 行为级描述方式基本运算电路 一、半加器(Half Adder) 二、全加器(Full Adder) 1、逻辑门构成加法器 2、集成全加器 3、串行加法器 4、超前进位加法器 三、全减器(Full Deductor) 数值比较电路 一、一位比较器 二、…

【论文阅读】三平面相关与变体

文章目录 1. 【CVPR2023】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction动机可视化方法Pipeline 2. 【2023/08/31】PointOcc: Cylindrical Tri-Perspective View for Point-based 3D Semantic Occupancy Prediction动机(针对雷达点云、与…

修改bag的frame_id的工具srv_tools

在使用数据集导航或者建图时,bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面: https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意: …

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人,我最常用的工具是Excel,对于我来说用Excel处理繁琐冗杂的数据并不难,但是我发现身边很多人用Excel做的数据报表非常的耗时,而且最后的成品也是难以直视,逻辑和配色等都非常的“灾难”。…

layui table 纵向滚动条导致单元格表头表体错位问题

我用的时layui2.6.8版本 历史项目维护,bug给我让我做了,本来利用前端手段强解决,后来发现很多table 找了解决办法 打开layui-v2.6.8/lay/modules/table.js 如果打开后时压缩的代码 直接搜索 e.find(".layui-table-patch") …

C语言学习笔记:流程控制和数据输入输出

流程控制和数据的输入输出 算法 著名计算机科学家沃思提出了一个公式: 数据结构 算法 程序 数据结构:对数据的描述 算法:对操作步骤的描述 算法定义 广义的说,为解决一个问题而采取的方法和有限的步骤,就称为“…

旋转图像(java)

题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 代码思路: class Solution {public void ro…