图像及视频的基本操作

news2024/10/22 10:44:51

文章目录

    • 一、认识计算机中的图像
    • 二、图像数据的读取
    • 三、数据读取-视频
    • 四、图像的其他操作

一、认识计算机中的图像

在这里插入图片描述
一张彩色图片是由很多个像素点组合而成的,而一个像素点是由R G B三个通道组成。RGB代表红色(Red)、绿色(Green)、蓝色(Blue)三种颜色的光的组合。RGB是加色模型的一种,用于显示图像。每个像素点的颜色都是通过调整这三种颜色的光的强度来混合得到的,而光的强度是在【0-255】

例如上面那个色彩像素块,它第二行倒数第一个的色点是有红色(R)的170亮度,加绿色(G)的155亮度,加蓝色(B)的165亮度组合而成的。

对于黑白图片(称为灰度图像),是没有以上三个颜色通道的,它只有一个通道,它只需亮度即可。

在这里插入图片描述
我们可以看到,这些像素点就是一些矩阵。如果一张图片的宽是500,高是500,那么它每一个像素点的RGB也是500x500,一般表示为【500,500,3】,这三个数分别代表着宽,高,颜色通道。

二、图像数据的读取

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np

# 使用cv2.imread()函数读取位于指定路径的图像文件
# "E:\\XUEXI\\Python_learn\\tupian\\1.jpg" 是图像文件的绝对路径
# 如果图像文件不存在或路径错误,该函数将返回None
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")

# 使用cv2.imshow()函数在窗口中显示图像
# 第一个参数是窗口名称,第二个参数是要显示的图像
cv2.imshow('Image', img)

# 使用cv2.waitKey()函数等待键盘输入
# 参数0表示无限期等待,直到用户按下任意键
cv2.waitKey(0)

# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

cv2.imread()函数读取位于指定路径的图像文件,并且引用图片的绝对路径需要使用 ‘\’ 进行引用

如果图像文件不存在或路径错误,该函数将返回None,可以用以下代码规范表达:

# 检查图片是否正确读取
if img is None:
    print("Error: 图片未找到或路径错误。")
else:
    cv2.imshow('Image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

使用cv2.imshow()函数在窗口中显示图像,cv2.imshow()的第一个参数是窗口名称,第二个参数是要显示的图像

cv2.waitKey()函数用于等待键盘输入,参数0表示无限期等待,直到用户按下任意键;如果参数不为0,则为定时显示。例如cv2.waitKey(10000)则图片显示10秒钟然后自动关闭。

cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口

我们也可以通过输出img来看看它的具体组成
在这里插入图片描述
可以看到它也是一个矩阵,并且值的范围都在【0-255】之间。

图片的读取也可以将它写成一个函数,等使用的时候直接调用就可以了:

def cv2_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

灰色图片读取方式
加上cv2.IMREAD_GRAYSCALE即可变成灰色图片

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg",cv2.IMREAD_GRAYSCALE)

在这里插入图片描述
很多情况下,我们一般都会将彩色图片先读取成灰色图片进行预处理的。就例如下面所示,颜色通道失去GBR三通道,并且图像的尺寸也减小了,更适合用于图像预处理。
在这里插入图片描述
在这里插入图片描述
图片的保存方法:

cv2.imwrite('mydog.jpg',img)

三、数据读取-视频

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 使用cv2.VideoCapture()函数创建一个VideoCapture对象,用于读取视频文件
vc = cv2.VideoCapture("E:\\XUEXI\\Python_learn\\shipin\\1.mp4")

# 检查视频是否成功打开
if vc.isOpened():
    # 如果成功打开,读取视频的第一帧
    open, frame = vc.read()
else:
    # 如果失败,设置open为False
    open = False

# 使用while循环读取视频的每一帧
#while open:也就是当open = True时
while open:
    # 读取下一帧
    ret, frame = vc.read()
    # 如果读取的帧是None,说明视频已经结束,跳出循环
    if frame is None:
        break
    # 如果读取成功(ret为True),则进行处理
    if ret == True:
        # 将当前帧从BGR颜色空间转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 使用cv2.imshow()函数显示灰度图像
        cv2.imshow("result", gray)
        # 使用cv2.waitKey()函数等待80毫秒,检查是否有按键按下
        # 如果按下的是ESC键(键码27),则跳出循环
        if cv2.waitKey(80) & 0xFF == 27:
            break

# 释放VideoCapture对象,释放视频文件
vc.release()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()

cv2.VideoCapture()函数创建一个VideoCapture对象,用于读取视频文件

在OpenCV中,cv2.VideoCapture.read()方法用于从视频流或视频文件中读取帧。这个方法返回两个值:ret和frame。

ret是一个布尔值(True或False)。
如果成功读取帧,ret为True。
如果无法读取帧(例如,视频已经结束或读取过程中发生错误),ret为False。

frame是当前读取的帧的图像数据。
如果ret为True,frame包含当前帧的图像数据。
如果ret为False,frame可能为None或不包含有效数据。

运行结果是一段视频:
在这里插入图片描述

四、图像的其他操作

截取部分图像数据

img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
cat = img[0:50,0:200]
cv2_show("cat", cat)

cat = img[0:50,0:200]这里的意思是截取图片的宽【0-50】,长【0-200】

运行结果:
在这里插入图片描述

颜色通道提取

# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示(虽然在这个代码中没有使用到)
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算(虽然在这个代码中没有使用到)
import numpy as np

# 定义一个函数cv2_show,用于显示图像
def cv2_show(name, img):
    # 使用cv2.imshow()函数显示图像
    cv2.imshow(name, img)
    # 使用cv2.waitKey(0)函数等待,直到用户按下任意键
    cv2.waitKey(0)
    # 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
    cv2.destroyAllWindows()

# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")

# 使用cv2.split()函数将图像的BGR通道分离
b, g, r = cv2.split(img)
# 使用cv2.merge()函数将分离的通道重新合并,用于后续操作
img = cv2.merge((b, g, r))

# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的B和G通道值设置为0,只显示R通道
cur_img[:, :, 0] = 0
cur_img[:, :, 1] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("R", cur_img)

# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的B通道值设置为0,只显示G和R通道
cur_img[:, :, 0] = 0
cur_img[:, :, 2] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("G", cur_img)

# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的G通道值设置为0,只显示B和R通道
cur_img[:, :, 1] = 0
cur_img[:, :, 2] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("B", cur_img)

cv2.split()函数将图像的BGR通道分离

cv2.merge()函数将分离的通道重新合并,用于后续操作

cur_img[:, :, 0] = 0
cur_img[:, :, 1] = 0

cur_img:是原图像的一个副本。
[:, :, 0]:表示选择图像的所有行(:)和所有列(:),以及第一个颜色通道(0代表蓝色通道)。
[:, :, 1]:表示选择图像的所有行和所有列,以及第二个颜色通道(1代表绿色通道)。
这两行代码的作用是:
将cur_img图像的所有蓝色通道(B通道)的像素值设置为0。
将cur_img图像的所有绿色通道(G通道)的像素值设置为0。
从而达到颜色通道提取的作用。

只保留红色通道的运行结果:
在这里插入图片描述

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

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

相关文章

我常用的两个单例模式写法 (继承Mono和不继承Mono的)

不继承Mono 不继承Mono代表不用挂载到场景物体上面,因此直接饿汉式 加 合并空运算符判空创建实例 >(lambda表达式)的意思是get,就是将instance赋给Instance属性 //单例private static JsonDataManager instance new JsonDataManager();public stati…

【JavaScript进阶】深入探讨JS中的对象及其事件处理

1.JS中的对象(掌握) 1. Array数组对象(重点) 数组对象是使用单独的变量名来存储一系列的值。 1.1创建一个数组 创建一个数组,有三种方法。 【1】常规方式: let 数组名 new Array(); 【2】简洁方式: 推荐使用 let 数组名 new Array(数…

没有接口设计文档怎么做测试?

一、接口是什么? 1.官方解释:API(Application Programming Interface) 即应用程序接口。是一个软件组件,或是一个Web服务与外界进行交互的接口,这里接口可以和API划等号。 2.逐层叠加方式解释: 功能层面&#xff1a…

Vert.x,Web - Restful API

将通过Vert.x Web编写一个前后分离的Web应用,做为Vert.x Web学习小结。本文为后端部分,后端实现业务逻辑,并通过RESTfull接口给前端(Web页面)调用。 案例概述 假设我们要设计一个人力资源(HR)系统,要实现对员工信息的增删改查。…

MybatisPlus+Spring Boot3 分页查询实现

目录 导入依赖 本文的house表 直接复制粘贴运行即可 MybatisConfig配置文件 创建数据库对应的实体类 创建mapper层接口 在service包下创建xxxService接口 controller层创建XXXController类 完成分页查询 导入依赖 <!--注意 SpringBoot3的依赖与Spring Boot2的Mybatis…

时隔11年,再次被纳入标普500指数,戴尔科技股票是否该买入?

猛兽财经核心观点&#xff1a; &#xff08;1&#xff09;9月24日&#xff0c;戴尔科技时隔11年后再次被纳入了标普500指数。 &#xff08;2&#xff09;华尔街分析师普遍很看好戴尔科技&#xff0c;并强调了戴尔科技在人工智能服务器和强劲的收入增长。 &#xff08;3&#xf…

枚举在Java体系中的作用

1. 枚举 枚举是在JDK1.5以后引入的。主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; //用public static final修饰常量 public static final int RED 1; public static final int GREEN 2; public static f…

深度学习-24-基于keras的十大经典算法之残差网络ResNet

文章目录 1 残差网络(ResNet)1.1 ResNet简介1.2 ResNet结构2 模型应用2.1 加载数据2.2 构建模型SimpleResNet2.2.1 simple_resnet_block2.2.2 SimpleResNet2.2.3 实例化模型2.2.4 模型训练2.2.5 模型预测2.3 构建模型ResNet182.3.1 residual_block2.3.2 ResNet182.3.3 训练模型…

Redis高并发缓存设计问题与性能优化

1、缓存设计典型问题 1.1、缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常出于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失…

vue3 Invalid value type passed to callWithAsyncErrorHandling()

vue3 提示警告。页面内点击按钮无响应 原因&#xff1a; <el-form :model"questionPage.queryParam" ref"queryForm" :inline"true"> ... <el-button type"primary" plain click"queryForm">查询</el-butto…

热门超声波清洗机有哪些?双十一适合学生党的清洗机推荐!

十一月十一号的双十一马上就快要到了&#xff0c;在这个一年一度的购物狂欢节中&#xff0c;不少人都期待着能够以优惠的价格购买到心仪的商品。超声波清洗机作为近年来备受关注的家用电器之一&#xff0c;以其清洁效果好、操作简便、价格亲民等特点&#xff0c;成为了大家双十…

leetcode二叉树(五)-二叉树层序遍历

题目 102.二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7…

imx6ull-正点原子阿尔法-uboot-v2.4网络驱动修改

1 修改网络 PHY 地址,修改 PHY 驱动 /*[c] 1 修改网络PHY地址,修改PHY驱动*/ /******************************************************************************/ #if (CONFIG_FEC_ENET_DEV 0) #define IMX_FEC_BASE ENET_BASE_ADDR #define CONFIG_FEC_MXC_PHYADDR …

Electron-(一)创建桌面应用

一、概述 本文通过核心步骤介绍&#xff0c;形成使用Electron进行桌面应用创建的概述性内容。 在当今的软件开发领域&#xff0c;Electron 作为一款强大的工具&#xff0c;为开发者提供了一种便捷的方式来创建跨平台的桌面应用。本文将通过详细介绍核心步骤&#xff0c;带您领…

记一次有趣的发现-绕过堡垒机访问限制

前言 在某一次对设备运维管理的时候&#xff0c;发现的某安全大厂堡垒机设备存在绕过访问限制的问题&#xff0c;可以直接以低权限用户访问多个受控系统&#xff0c;此次发现是纯粹好奇心驱使下做的一个小测试压根没用任何工具。因为涉及到了很多设备和个人信息&#xff0c;所以…

AI大模型引领智慧城市:11个行业应用场景全解析

AI大模型在智慧城市11个行业的应用场景‍‍‍ 人工智能是当今科技领域最前沿的课题&#xff0c;更是新一轮科技革命的重要代表之一。从AlphaGo Zero通过自我学习碾压“AI前辈”AlphaGo&#xff0c;到百度智能无人汽车成功上路、苹果手机开启新的刷脸认证方式……而最近&#x…

老师发期中成绩小程序-易查分一键发布省事~

老师注意&#xff0c;本学期的期中考试即将拉开帷幕。考试结束后&#xff0c;成绩的发布往往是我们觉得最繁琐耗时的工作。逐一私信每个学生家长&#xff0c;告知他们的考试情况。使用我要向老师们推荐一个神器——易查分&#xff0c;能让老师一分钟完成期中成绩发布的工作。 易…

亿赛通与Ping32文档加密功能全面盘点,选择最适合的工具

在信息化迅速发展的今天&#xff0c;文档安全愈发成为企业关注的焦点。为了保护敏感数据不被非法访问或泄露&#xff0c;选择一款高效的文档加密工具至关重要。亿赛通与Ping32作为市场上备受认可的安全解决方案&#xff0c;各自提供了强大的文档加密功能。本文将对这两款软件的…

嘉立创EDA—51最小系统PCB

1&#xff0c;灵活使用 下边栏的库中可以搜索对应需要的型号&#xff0c;如51最小系统板 常用库中有常用的电容和电阻&#xff0c;以及排针等,熟悉一些常用快捷键的使用 设计完电路后可以选用折线进行分区&#xff0c;写好每个网络标号&#xff0c;以及添加一些文字说明 最后可…