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

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 对象,用于写入视频。

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

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

相关文章

javaweb-day03-前端零碎

1.Ajax (1)概述 (2)原生Ajax-繁琐,现已基本弃用 2.Ajax-Axios (2)案例 3.前端工程化 3.1 基础 3.2 vue项目 (1)项目目录结构 (2)主要开发…

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接: A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要:论文提出了一个Pipline软件平台,可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

Python毕业设计选题:基于django+vue的智能停车系统的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址:小皮面板(phpstudy) - 让天下没有难配的服务器环境! 安装说明(特别注意) 1. 安装路径不能包含“中文”或者“空格”,否则会报错(例如错误提示:Cant cha…

【jmeter】服务器使用jmeter压力测试(从安装到简单压测示例)

一、服务器上安装jmeter 1、官方下载地址,https://jmeter.apache.org/download_jmeter.cgi 2、服务器上用wget下载 # 更新系统 sudo yum update -y# 安装 wget 以便下载 JMeter sudo yum install wget -y# 下载 JMeter 压缩包(使用 JMeter 官方网站的最…

【大数据学习 | Spark-Core】详解Spark的Shuffle阶段

1. shuffle前言 对spark任务划分阶段,遇到宽依赖会断开,所以在stage 与 stage 之间会产生shuffle,大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

Meta 发布Sapiens人类视觉模型,2D 姿势估计、人体分割、深度估计

meta提出了 Sapiens,人类基础视觉模型。这是一个以人为中心的视觉任务的模型。包括: 2D 姿势估计、人体部位分割、深度估计和表面法线预测。 此模型本身支持 1K 高分辨率推理,Sapiens在超过 3 亿张人类图像上预训练的模型进行微调&#xff0c…

NLP论文速读(EMNLP2024)|多风格可控生成的动态多奖励权重

论文速读|Dynamic Multi-Reward Weighting for Multi-Style Controllable Generation 论文信息: 简介: 本文探讨了文本风格在沟通中的重要性,指出文本风格传达了除原始语义内容之外的多种信息,如人际关系动态(例如正式…

鸿蒙中的Image组件如何引用网络图片

1.引用网络图片资源 引入网络图片需要申请权限ohos.permission.INTERNET,此时,Image组件的src参数为网络图片的链接,为了成功加载网络图片,您需要在module.json5文件中申请网络访问权限 注意:实际可用的时候&#xff0…

七天掌握SQL--->第七天:项目实践与总结

一、项目实践 1.1 项目背景 假设我们正在开发一个名为“在线图书管理系统”的项目。该项目旨在帮助图书馆管理员管理图书的借阅、归还、库存等操作,同时为读者提供一个便捷的图书查询和借阅平台。 1.2 数据库设计 1.2.1 需求分析 根据项目的需求,我…

React Hooks中use的细节

文档 useState useState如果是以函数作为参数,那要求是一个纯函数,不接受任何参数,同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值,当以一个函数作为参数进行传入的时候需要注意&#xff…

springboot 配置跨域访问

什么是 CORS? CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制&#xff0…

应用于蛋白-小分子柔性对接的等变VAE模型 - FlexPose 测评

FlexPose 应用于蛋白-小分子柔性对接场景下,能够在欧几里得空间中直接对蛋白-小分子复合结构的进行预测的等变神经网络模型,而无需传统的采样和评分策略。此模型考虑了蛋白氨基酸主链和侧链的柔性,会根据小分子的情况对氨基酸的侧链和主链进行…

【Web前端】如何构建简单HTML表单?

HTML 表单是 Web 开发中非常重要的组成部分。它们是与用户交互的主要方式,能够收集用户输入的数据。表单的灵活性使它们成为 HTML 中最复杂的结构之一,但若使用正确的结构和元素,可以确保其可用性和无障碍性。 表单的基本结构 HTML 表单使用…

乌班图单机(不访问外网)部署docker和服务的方法

面向对象:Ubuntu不能访问外网的机子,部署mysql、redis、jdk8、minio 过程: 1、安装docker(照着图去这里找对应的下载下来https://download.docker.com/linux/static/stable/),将7个docker官网下载的文件下载下来后,传上去服务器随便一个文件夹或者常用的opt或者/usr/lo…

IDEA全局设置-解决maven加载过慢的问题

一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…

狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程

Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件…

标贝科技:自动驾驶中的数据标注类别分享

国内的自动驾驶行业正处于快速发展阶段。伴随随着芯片算力的提升、算法的优化以及数据采集标注传感设备的日益成熟,自动驾驶技术正逐步从实验室转向商业化应用。电车时代的来临,加速了自动驾驶时代的全面降临,23年国内汽车行业内卷的开始&…

(详细文档!)java swing学生信息管理系统 +mysql

第一章:系统功能分析 1.1、系统简介与开发背景 学生信息管理系统是在信息化时代,特别是在教育领域中产生的。随着学校规模的不断扩大和信息化技术的不断发展,传统的纸质档案管理方式已经无法满足学校对学生信息管理的需求,因此需…