opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度

news2024/11/16 17:58:18

opencv-python中一些常用函数解析及参数介绍

  • 前言
  • 1.读图片
    • 读彩图
    • 读灰度图
  • 2.显示图片
    • 显示彩图
    • 显示灰度图
    • 灰度图与彩图的区别
    • 从彩图中分离单通道
    • 通道合并
  • 3.保存图片
  • 4.灰图的通道分离
  • 5.读取视频

前言

本文将简单介绍opencv-python中的图像以及视频的读取,并且介绍灰度图与彩图的通道,以及灰度图与单通道的联系与区别

1.读图片

假设我们有这样一张图片,它的名字是photo.jpg
在这里插入图片描述

读彩图

打开图片需要的参数有图片的路径和图片的打开方式
打开方式如下

cv2.IMREAD_COLORcv2.IMREAD_GRAYSCALE
彩色图片(默认)灰度图
img=cv2.imread('photo.jpg') # 此时默认打开的是彩色图片
img=cv2.imread('photo.jpg', cv2.IMREAD_COLOR)

这两种方式打开的都是彩色图,使用cv2打开的图片是以numpy.ndarray类型存储的

读灰度图

gray=cv2.imread('photo.jpg',cv2.IMREAD_GRAYSCALE)

2.显示图片

这里用到了三个函数

函数参数及解释
cv2.imshow需要两个参数,显示图片的名字(字符串类型),和numpy.ndarray类型的数据
cv2.waitKey需要一个时间参数表示等待时间(毫秒级),参数是0时表示任意键终止
cv2.destroyAllWindows用于消除窗口

显示彩图

cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

在这里插入图片描述

显示灰度图

这里将waitKey参数设成10000,及图片展示10000毫秒后退出

cv2.imshow('image',gray) 
cv2.waitKey(10000) 
cv2.destroyAllWindows()

灰度图与彩图的区别

我们先拿读出来的彩图来解释
cv2读出来的图片存储格式是numpy.ndarray,存储的顺序是(h, w, c),即(图片高,图片宽,通道数),图片高和图片宽可以理解,那么什么是通道呢

在cv2中通道就是指的三原色,即R(红)、G(绿)、B(蓝),尤为注意的是cv2中通道的顺序是(b, g, r)

既然彩图是由bgr混合成的,那么灰度图就很容易理解是只有一个通道了

我们还可以通过查看图片的形状来验证这一点
在这里插入图片描述
可以看到彩图和灰度图的差异
那么如果我们只取其中一个通道会怎样呢?

从彩图中分离单通道

为了表示方便我们先定义一个显示图像的函数

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

然后我们分别选取其中一个通道

cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv_show('R',cur_img)

在这里插入图片描述

cur_img = img.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv_show('G',cur_img)

在这里插入图片描述

cur_img = img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show('B',cur_img)

在这里插入图片描述
我们可以看出三个通道的效果,此时可能又有疑问,为什么只选取一个通道不是灰度图呢,因为我们现在不能算作真正的把单独的通道取出来,只是把另外的两个通道所有的值置为0了而已,本质上还是按照彩图显示的,那么我们接下来就将彩图的通道直接分离,观察一下效果,分离过程我们需要一个函数
cv2.split函数传进的参数是彩图,执行后会将通道分成bgr三个单通道

b,g,r=cv2.split(img)

不使用函数的话用以下代码也可以实现相同的效果

b,g,r = img[:,:, 0], img[:, :, 1], img[:, :, 2]

那么我们来看一下每个单通道的效果,首先我们用numpy中的函数np.hstack将三个通道合并,然后使用cv2.resize函数改变图片大小,可以更加方便的展示效果

gray_img = np.hstack([b, g, r])
gray_img = cv2.resize(gray_img, (600, 200))
cv_show("gray_img", gray_img)

在这里插入图片描述
可以看到三个灰度图是不同的,因为bgr存储的是不同的对应的通道信息
那么我们再将灰度图放进来做一下展示
在这里插入图片描述
可以看到最左边的是灰度图,右边为bgr的单通道图,他们四个是不一样的,所以灰度化不是单纯的选出其中一个通道,当然很多情况下选出其中一个通道作为灰度图也可以正常应用。

通道合并

我们将bgr用cv2.merge函数合并后可以看到与原图相同,但是如果将其中一个通道扩展到其他通道,即所有通道的值都设置成其中一个通道的值,显示结果依然会是一个灰度的图像,但是这个灰度不是真实的灰度图,他依然是三个通道,只不过三个通道的值完全相同,所以看上去是灰色的而已。

img_bgr=cv2.merge((b, g, r))
img_b=cv2.merge((b, b, b))
img_g=cv2.merge((g, g, g))
img_r=cv2.merge((r, r, r))
img_s = np.hstack([img, img_bgr, img_b, img_g, img_r])
img_s = cv2.resize(img_s, (1000, 200))
cv_show("img_s", img_s)

在这里插入图片描述

3.保存图片

使用cv2.imwrite,传入保存路径和要保存的图片即可保存,我们这里以保存灰度图为例

cv2.imwrite("gray.jpg", gray)

在这里插入图片描述

4.灰图的通道分离

那么问题又来了,如果本身读入的是灰色的图,那么通道分离后的结果是怎么样的呢

gray_img = cv2.imread("gray.jpg")
b, g, r = cv2.split(gray_img)
gray_bgr = np.hstack([b, g, r])
gray_bgr = cv2.resize(gray_bgr, (600, 300))
cv_show("bgr", gray_bgr)

在这里插入图片描述
可以看到,通道完全相同,也就是图片进行灰度处理后已经完全丧失了其他通道的信息了

5.读取视频

在了解图片的读取之后,我们来读取一下视频,首先使用cv2.VideoCapture进行类的实例化,需要的参数是视频的路径,之后调用vc.read读取视频帧。ret为False或者frame为None说明视频读取完成或视频读取失败,退出读取

vc = cv2.VideoCapture('test.mp4')
while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        cv2.imshow('result', frame)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

读取灰度化视频

vc = cv2.VideoCapture('test.mp4')

while open:
    ret, frame = vc.read()
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame,  cv2.COLOR_BGR2GRAY)
        cv2.imshow('result', gray)
        if cv2.waitKey(100) & 0xFF == 27:
            break
vc.release()
cv2.destroyAllWindows()

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

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

相关文章

Hello 2023

年初到年尾,感觉刚写完《Hello 2022》,就要迎接2023了。今天是2022最后一天,本来是元旦假期的第一天,奈何要来公司加班,抽个时间来回顾下 2022 吧。 2022 年和2021 一样也是里程碑的一年,完成了两件大事&a…

使用CSS提高网站性能的30种方法

根据httparchive.org的页面重量报告,CSS在平均70个请求和2MB的网页上占7个HTTP请求和70Kb的代码。这并不是网站性能糟糕的最坏原因(我正看着你呢,JavaScript),但CSS面临着特定的挑战: CSS会阻止渲染&#x…

【C++进阶】多态

文章目录多态的概念多态的定义及实现抽象类多态的原理多继承和单继承关系中的虚表函数继承和多态常见的问题多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 …

我的2022年,一位双非生的平淡一年

没有白走的路,每一步都算数🎈🎈🎈 前言 一谈到年终总结,其实还是很多的遗憾,我和大部分人一样,走过这一年的路途,发现自己除去每年头发越来越少,脸色日渐不佳。好像没有什…

Web 和移动应用程序测试之间的区别

智能手机改变了人类与技术互动的方式。无论是旅行、健身、生活方式、视频游戏,甚至是服务,都只需触手可及(字面意思就是如此)。我们只需要看看越来越多的智能手机或平板电脑用户与桌面用户就可以掌握这一现实。 根据一项调查,从 2021 年 4 月…

Dubbo(尚硅谷)学习笔记3

这是我们正常启动: 现在我们去把zookeeper注册中心关掉。 此时我们的注册中心是用不了的。 但是我们的数据还有,也就是我们的消费者还是能调用我们的提供者中的方法。 那么我们现在来试一下dubbo直连,也就是没有注册中心,我们也可…

VideoRender和ImageRender中的一些c++知识点

1.inline C中的inline用法_路痴的旅行的博客-CSDN博客 1 引入inline关键字的原因在c/c中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数,栈空间就是…

深入理解计算机系统_静态链接和动态链接以及静态库和动态库

这篇文章记录静态链接和动态链接以及静态库和动态库的原理。 1 静态链接和动态链接 链接其实就是连接的意思,将所有相关的东西连接起来。 1.1 静态链接 什么是静态链接?编译时候的链接就是静态链接,所以ld/collect2链接程序,也…

公司让我一个人干数据中台,是不是可以准备找下家了

大数据群里,有个哥们问了下面这样一个问题,让刚刚阳康返工的群友们笑的心跳加速,直接炸锅。 开工有惊喜 一个人搞一个数据中台!这是啥神仙领导做出来的决策?是发烧的时候拍脑袋定的吗?热心的群友也都给出了…

vector类的使用

目录 ​一、vector类的组织形式 二、vector类的成员函数 1.默认成员函数 (1)构造函数、拷贝构造函数 (2)析构函数和赋值运算符重载 2.容量操作 3.迭代器(iterator) 4.元素访问 5.修改操作 一、vec…

web3调研:Dusk Network调研

在此声明,仅做分享,绝不存在倡导炒币行为 原文链接:Dusk 调研报告 web3产品调研系列 1、web3调研:Iron fish调研 2、web3调研:Dusk Network调研 目录web3产品调研系列一、背景概述二、项目介绍2.1 创始团队2.2 项目融…

【数据结构】三万字图文讲解带你手撕八大排序(附源码)

👑作者主页:进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:数据结构 文章目录一、前言二、排序的概念和运用三、八大排序讲解及实现1、直接插入排序1.1 排序思路1.2 代…

Java重点源码回顾——ConcurrentHashMap1.7

1. 概述 HashMap在我们的日常生活中使用很多,但是它不是线程安全的。我们可以使用HashTable来代替,主要实现方式是在方法中加入synchronized,所以效率也比较低。因此,对于键值对,我们可以尝试使用ConcurrentHashMap来…

《Java 后端面试经》微服务篇

《Java 后端面试经》专栏文章索引: 《Java 后端面试经》Java 基础篇 《Java 后端面试经》Java EE 篇 《Java 后端面试经》数据库篇 《Java 后端面试经》多线程与并发编程篇 《Java 后端面试经》JVM 篇 《Java 后端面试经》操作系统篇 《Java 后端面试经》Linux 篇 《…

关于Linux 网络抓包的一些笔记整理

写在前面 遇到一个 ping 单通 的情况,需要抓包分析下,所以整理这部分笔记博文内容涉及: HTTP/TCP 抓包分析 DemoICMP 抓包分析 DemoNginx 抓包分析用户名密码 Demo 理解不足小伙伴帮忙指正 这世界的存在完全只是就它对一个其他事物的&#xf…

【自学Java】Java选择结构if

Java选择结构if Java语言if条件判断 在 Java 中,关键字 if 是用于测试某个条件(布尔型或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后面的大括号 {} 括起来的代码块,如果没有代码…

hnu社交网络分析作业2

前言:前言:上的是林剑新老师的课程,还是比较有意思的,此博客用来记录作业的学习情况,答案为老师提供的 一、2 跳标签索引是一种在网络中进行距离查询时广泛使用的技术。算法 1 描述了一种在无向图中构造 2 跳标签索引…

Java 接口介绍和使用

1.什么是接口? 接口就是给出一些没有实现的方法,封装到一起,当某一个类要使用的时候再实现出来。 2.接口的语法 interface name{ attributes methods } 比如如下USB接口 public interface Usb {public void start();public void s…

Vue 中 CSS scoped 的原理

前言 在日常的Vue项目开发过程中&#xff0c;为了让项目更好的维护一般都会使用模块化开发的方式进行。也就是每个组件维护独立的template&#xff0c;script&#xff0c;style。主要介绍一下使用<style scoped>为什么在页面渲染完后样式之间并不会造成污染。 示例 搭…

FreeRTOS开发指南

1&#xff1a;任务模板 //任务优先级 #define XXX_TASK_PRIO 1 //任务堆栈大小 #define XXX_STK_SIZE 128 //任务句柄 TaskHandle_t XXXTask_Handler NULL; /* * 放在开始任务&#xff0c;只需要执行一次为了创建任务 */ void Create_XXX_Task(void) {BaseType_t xR…