图像及视频的基本操作

文章目录

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

一、认识计算机中的图像

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

例如上面那个色彩像素块,它第二行倒数第一个的色点是有红色(R)的201亮度,加绿色(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为Falseopen = 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.rhkb.cn/news/450732.html

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

相关文章

【远程监控新体验】OpenObserve结合内网穿透无公网IP远程访问全攻略

文章目录 前言1. 安装Docker2. Docker镜像源添加方法3. 创建并启动OpenObserve容器4. 本地访问测试5. 公网访问本地部署的OpenObserve5.1 内网穿透工具安装5.2 创建公网地址6. 配置固定公网地址前言 本文主要介绍如何在Linux系统使用Docker快速本地化部署OpenObserve云原生可观…

MacOS RocketMQ安装

MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客:https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网,…

并发-线程

1, 线程 线程(thread)也是并发的一种形式,线程是比进程更小的活动单位,一个进程中可以有多个线程,线程是进程内部的一个执行分支。 一个进程刚开始时只有一个线程(称之为主线程),后续的代码中可以创建新的线程,可以指…

git提交到github个人记录

windows下git下载 1.进入git官网https://git-scm.com/downloads/win 一直默认选项即可 2.在settings中SSH and GPG keys中Add SSH key 3.选择git cmd git使用 1.配置用户名,和邮箱 git config --global user.email "youexample.com" git config --g…

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理 学习内容: AWS的虚拟私有,共有子网以及ACL定义公网碉堡主机子网,私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…

深入理解WPF中的命令机制

Windows Presentation Foundation(WPF)是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础,具有强大的图形和媒体处理能力。在WPF中,“命令”是一个重要的概念,它为应用程序开发…

如何在算家云搭建Video-Infinity(视频生成)

一、模型介绍 Video-Infinity是一个先进的视频生成模型,使用多个 GPU 快速生成长视频,无需额外训练。它能够基于用户提供的文本或图片提示,创造出高质量、多样化的视频内容。 二、模型搭建流程 1.大模型 Video-Infinity 一键使用 基础环境…

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析 在 Nest.js 应用中,当你试图通过 request.ip 获取客户端的 IP 地址时,如果总是返回 ::1 或者 ::ffff:127.0.0.1,这通常意味着请求来自本地主机。 因为在前后端分离应用中,前端请求后端服务一般的做法都是通过代理&…

SQL进阶技巧:如何删除第N次连续出现NULL值所存在的行?

目录 0 场景描述 1 数据准备 2 问题分析 问题拓展:如何删除第2次、第3次、第N次连续出现NULL值所在的行? 3 小结 0 场景描述 有下面的场景: 我们希望删除某id中连续存在NULL值的所有行,但是保留第一次出现不为NULL值的以下所有存在NULL值的行。具体如下图所示: 如…

Leetcode 判断子序列

通过双指针来判断字符串s是否是字符串t的子序列。 算法思想: 双指针法: 我们使用两个指针i和j分别遍历字符串s和t。初始时,i指向s的第一个字符,j指向t的第一个字符。 匹配字符: 每次比较s[i]和t[j]: 如果…

大数据治理-数据质量管理

目录 一、定义数据质量 1.1 数据质量的定义 1.2 数据质量的重要性 二、常见的数据质量问题 2.1 数据不准确 2.2 数据不完整 2.3 数据不一致 2.4 数据不及时 2.5 数据无效 2.6 数据重复 三、数据清洗与转换 3.1 数据清洗 3.1.1 数据审计 3.1.2 数据验证 3.1.3 数…

uniapp小程序自定义聚合点

注&#xff1a; 1.默认的聚合点可以点击自动展示子级点位&#xff0c;但是自定义的聚合点在ios上无法触发markerClusterClick的监听&#xff0c;至今未解决&#xff0c;不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…

Linux - 环境变量 | 命令行参数 | 进程基础

文章目录 一、了解冯诺依曼体系结构1、概念2、对数据层面3、实例二、操作系统1、概念2、设计OS的目的3、定位4、操作系统怎么管理&#xff1f; 三、进程1、概念2、怎么管理进程3、描述进程-PCB4、描述进程怎么运行&#xff08;粗略&#xff09;5、进程属性6、创建子进程7、创建…

PDF文件为什么不能编辑是?是啥原因导致的,有何解决方法

PDF文件格式广泛应用于工作中&#xff0c;但有时候我们可能遇到无法编辑PDF文件的情况。这可能导致工作效率降低&#xff0c;特别是在需要修改文件内容时显得尤为棘手。遇到PDF不能编辑时&#xff0c;可以看看是否以下3个原因导致的。 一、文件受保护 有些PDF文件可能被设置了…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

[每周一更]-(第119期):“BP”大揭秘:生物学与金融学中的微小单位竟有如此大不同!

最近&#xff08;2024.09.29&#xff09;央行要把存量房贷在LPR&#xff08;贷款市场报价利率&#xff09;基础上&#xff0c;降低30BP&#xff0c;刚好基因行业内&#xff0c;也有bp的概念&#xff0c;通过发音无法区分&#xff0c;以下就讲解下生物学的bp和金融学的BP的概念的…

汽车零部件行业CRM应用数字化解决方案解析

1.行业背景与挑战分析 近年来&#xff0c;随着国家对新能源汽车行业的大力支持&#xff0c;国内汽车产业不仅在国内市场实现了弯道超车&#xff0c;而且新能源汽车的海外出口也开拓了新的市场&#xff0c;为自主品牌的新能源战略贡献了新的增长点&#xff1b;这一迅猛发展的趋…

最新版快递小程序源码 独立版快递系统 附教程

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 懂得都懂&#xff0c;现在电商平台退换货量大&#xff0c;快递需求量大&#xff0c;对接物流一个单子4块到6块之间 其中间是例如润 其余的 就不说了吧 互站上买的源码 分享一下 还有…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中&#xff0c;了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络&#xff08;如互联网&#xff09;的关键节点&#xff0c;它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

SSM框架学习(六、快速启动框架:SpringBoot3实战)

目录 一、SpringBoot3介绍 1.SpringBoot3简介 2.快速入门 3.入门总结 &#xff08;1&#xff09;Question1&#xff1a;为什么依赖不需要写版本&#xff1f; &#xff08;2&#xff09;Question2&#xff1a;启动器&#xff08;starter&#xff09;是什么&#xff1f; &a…