【图像识别】openCV基础知识

图像处理基础

  • 一、使用OpenCV前要准备的工作
    • 1.先导入需要用到的库
    • 2.自定义,图片展示函数
  • 二、开始学习常用函数
    • 1.生成随机整数
      • ①. 函数说明
      • ②.代码
        • a. 二维灰度图
        • b. 三维彩色图
      • ③.代码现象
        • a. 二维灰度图
        • b. 三维彩色图
    • 2.通道的分离与合并
      • ①先导入一张图片
      • ② 将其RGB分离开
        • 函数说明
      • ③可以查看当前图片的尺寸与通道数
        • 函数说明
      • ④将分离开的图像通道合并成一张彩色图
        • 函数说明
    • 3.彩色图转灰度图
      • ①可以将上面分离出来的r、g、b 按照比例相加,便可转化为灰度图
        • a.再将其转换成uint8类型的,方便后续处理
      • ②OpenCV提供的函数
      • 思考:灰度图可以转换回彩色图吗?
    • 4.图像二值化
      • ① 直接写
      • ① OpenCV提供的函数
    • 4.图像运算
      • ① 相乘(掩膜)
      • ① 相除(矫正设备,比较差异)
    • 5. 两图像 相加减乘除
      • ① 相加
        • a.这样直接相加的话,当2个点的值大于255时,它的差值 会自动跳到从1开始
        • b.而OpenCV提供的函数则不会,当和超过255时,它会自动固定在最大值255
        • c.优化:给两张相加的图各乘1个0.5,bingo!
        • d.虽然与c.的现象差不多,但是它们的数据类型是不一样的
      • ② 相减
        • 注意直接相减 与 OpenCV库函数的不同
      • ③ 相乘
          • 细节
      • ④ 相除
    • 5. 两图像 相加减乘除
  • 三、小任务:图像融合
    • 1、导入图片
    • 2、提取所需要的特征
    • 3、结果就融合啦
    • 4、保存

一、使用OpenCV前要准备的工作

1.先导入需要用到的库

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

2.自定义,图片展示函数

定义好了,调用方便。

def show(img):
    if img.ndim == 2: #这句话是用来判断是否为灰度图的
        plt.imshow(img, cmap='gray', vmin=0, vmax=255)
    else:
        plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))

二、开始学习常用函数

1.生成随机整数

random_int = np.random.randint(low, high=None, size=None, dtype=int)

①. 函数说明

low:生成的随机整数范围的下限(包含),默认为0。
high:生成的随机整数范围的上限(不包含)。
size:生成的随机整数的形状,可以是整数、元组或列表,默认为None。
【参数为 (x,y)生成的整数为二维的,就是灰度图嘛; (x,y,z)生成的整数为三维的,那就是彩色图咯!】
dtype:生成的随机整数的数据类型,默认为int。
a. 生成一个范围在0到9之间(包含0,不包含9)的随机整数:
random_int = np.random.randint(0, 9)
print(random_int)
b. 生成一个范围在5到10之间(包含5,不包含10)的2x3的随机整数矩阵:
random_int_matrix = np.random.randint(5, 10, size=(2, 3))
print(random_int_matrix)

②.代码

a. 二维灰度图

A = np.random.randint(0,256,(2,4),dtype = np.uint8)
A
show(A)

b. 三维彩色图

B = np.random.randint(0,256,(2,4,3),dtype = np.uint8)
B
show(B)

③.代码现象

a. 二维灰度图

在这里插入图片描述

b. 三维彩色图

在这里插入图片描述

2.通道的分离与合并

①先导入一张图片

img = cv.imread('pic/cubic500x500.jpg')
show(img)

在这里插入图片描述

② 将其RGB分离开

b,g,r = cv.split(img)
show(r)

函数说明

cv.split() 是 OpenCV 库中用于分离图像通道的函数。它将输入的彩色图像分离成每个通道的单独图像。
在函数调用 b,g,r = cv.split(img) 中,img 是输入的彩色图像。函数将会返回三个分别表示蓝色通道、绿色通道和红色通道的图像。

在这里插入图片描述

③可以查看当前图片的尺寸与通道数

img.shape

很容易看得出来,500,500 对应图片的尺寸,3 对应通道数(彩色的)

在这里插入图片描述

函数说明

img.shape 是一个 NumPy 数组属性,用于获取图像的形状信息。
对于一张图像,它通常由三个维度构成:高度、宽度和通道数。img.shape 返回一个表示图像形状的元组,其中包含这三个维度的值。
如果图像是灰度图像,则只有高度和宽度两个维度;如果图像是彩色图像,则还包含通道数(通常为 3)。

④将分离开的图像通道合并成一张彩色图

img2 = cv.merge([b, g, r])
show(img2)

函数说明

cv.merge() 是 OpenCV 库中用于将分离的图像通道合并成彩色图像的函数。它接受一个由各通道图像组成的列表作为输入,并返回一个合并后的彩色图像。
在函数调用 img2 = cv.merge([b, g, r]) 中,[b, g, r] 是一个包含蓝色通道、绿色通道和红色通道图像的列表。函数将会将这些通道图像合并成一张彩色图像,并将结果赋值给 img2。

在这里插入图片描述

3.彩色图转灰度图

①可以将上面分离出来的r、g、b 按照比例相加,便可转化为灰度图

相乘的分数值,和为1即可。太大,太小会出现问题
在这里插入图片描述

a.再将其转换成uint8类型的,方便后续处理

两种方式:

gray2 = np.uint8(gray1)
gray2
gray3 = gray1.astype(np.uint8)
gray3

②OpenCV提供的函数

gray4 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
show(gray4)

思考:灰度图可以转换回彩色图吗?

灰度图像转换回彩色图像的过程是一个无法还原的操作,因为在将彩色图像转换为灰度图像时,颜色信息已经丢失了。所以从灰度图像直接恢复到原始的彩色图像是不可能的。
然而,你可以通过一些方法将灰度图像着色来生成一张类似于彩色图像的图像,但这并不是真实的彩色。这种方法被称为着色化或彩色重建。
一种常见的着色化方法是使用深度学习模型,它可以从灰度图像中学习到彩色映射。这些模型通过训练大量的彩色图像和对应的灰度图像对来学习映射关系,并用于将灰度图像着色。

4.图像二值化

二值化嘛,很形象,看代码

① 直接写

在这里插入图片描述

① OpenCV提供的函数

在这里插入图片描述
在这里插入图片描述

4.图像运算

黑的是1,白的是0,灰色的是介于0和1之间的值

① 相乘(掩膜)

在这里插入图片描述

① 相除(矫正设备,比较差异)

在这里插入图片描述

5. 两图像 相加减乘除

在这里插入图片描述

① 相加

a.这样直接相加的话,当2个点的值大于255时,它的差值 会自动跳到从1开始

在这里插入图片描述

b.而OpenCV提供的函数则不会,当和超过255时,它会自动固定在最大值255

在这里插入图片描述

c.优化:给两张相加的图各乘1个0.5,bingo!

在这里插入图片描述

d.虽然与c.的现象差不多,但是它们的数据类型是不一样的

c.乘完以后,会被转换成浮点数的形式
d.则会保留原始的 uint8
在这里插入图片描述
在这里插入图片描述

② 相减

注意直接相减 与 OpenCV库函数的不同

在这里插入图片描述

③ 相乘

细节

因为【数据类型要相同】前面mask/255 变成了浮点数,所以 前面的obj也要变为浮点数
在这里插入图片描述

④ 相除

在这里插入图片描述

5. 两图像 相加减乘除

我对它的理解是可以调节图像的亮度
然后GPT是说:可以用于调整图像的亮度、对比度、颜色平衡等,同时也可以进行更加复杂的图像增强和改善。
在这里插入图片描述

三、小任务:图像融合

1、导入图片

在这里插入图片描述

2、提取所需要的特征

M/255 就全变黑了。就是原本黑的地方值为0,(原来是255)白的地方值为1
1-M 就是把把白的地方变为0,黑的0变为255(就成白色的了)颜色反转。然后A乘(1-M)就是原本有花的地方保留,中心被掏了(0乘多少还是0);
B * M 同理。
在这里插入图片描述

3、结果就融合啦

在这里插入图片描述

4、保存

在这里插入图片描述

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

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

相关文章

Python获取指定路径下所有文件的绝对路径

import osdef get_file_path_by_name(file_dir, format.JPG):获取指定路径下所有文件的绝对路径:param file_dir::return:L []for root, dirs, files in os.walk(file_dir): # 获取所有文件for file in files: # 遍历所有文件名if os.path.splitext(file)[1] format: L.ap…

typeScript(持续吐血版)

typeScript-02-进阶(TSVue3) 结合vue3来使用TypeScript 使用vite来创建vue3TS的项目 使用vite创建项目,并选择带ts的版本 npm create vitelatest my-vue-ts-app – --template vue-ts 参考链接:https://vuejs.org/guide/typescript/composition-api…

深度学习基础

1 机器学习、深度学习、人工智能 1.1 机器学习 机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身性能的学科。 基本步骤:获取数据、数据预处理、特征提取、特征选择…

FFmpeg5.0源码阅读—— avcodec_send_packetavcodec_receive_frame

摘要:本文主要描述了FFmpeg中用于解码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。   关键字:ffmpeg、avcodec_send_packet、avcodec_receive_frame   读者须知:读者需要了解FFmpeg的基本使用流程&#xf…

MySQL 主从复制[异步 同步 半同步复制] 读写分离 优化 (非常重要)

MySQL 主从复制 1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据…

计算机网络概述(三)

常见的计算机网络体系结构 OSI体系结构: 物理层→数据链路层→网络层→运输层→会话层→表示层→应用层 TCP/IP体系结构: 网络接口层→网际层→运输层→应用层 一般用户的设备都有TCP/IP协议用于连接因特网,TCP/IP的网络接口层并没有规定使用…

【Redis】秒杀业务设计、悲观锁与乐观锁

1 全局ID生成器 一些情境下,使用数据库的ID自增将会产生一些问题。 一方面,自增ID规律性明显,可能被猜测出来并产生一些漏洞另一方面,当数据量很大很大很大时,单表数据量可能会受到限制,需要分表&#xf…

网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 滑动窗口机制 三、TCP协议的 流量控制机制 四、TCP协议的 拥塞控制机制 五、TCP协议的 延时应答机制 六、TCP协议的 捎带应答机制 总结 前言 本人是一个普通程序猿!分享一点自己的…

RabbitMQ在SpringBoot中的高级应用(2)

过期时间 1.单独的设置队列的存活时间,队列中的所有消息的过期时间一样 Bean//创建交换机public DirectExchange ttlQueueExchange(){// 交换机名称 是否持久化 是否自动删除return new DirectExchange("ttl_queue_log",true,false);}Bean//创建队列publ…

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在,使用 Prompt 可以快速开发一个应用程序,但是一个应用程序可能需要多次写Prompt,并对 LLM 的输出结果进行解析。因此,需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

需求分析引言:架构漫谈(五)架构师成长之路

我研发领域也从事了一些年,期间也做过一些架构设计工作,包括C#单体转型为Java微服务、Python单体转型为Java微服务等, 也尝试着从自己的经验角度,来汇总一些知识点,同时描述一下如何成长为一个合格的软件架构师&#x…

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 研究背景:…

Docker 中的 .NET 异常了怎么抓 Dump (转载)

一、背景 1. 讲故事 有很多朋友跟我说,在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高,内存暴涨 等各种Dump,为什么你没有写在 Docker 中如何抓的相关文章呢?瞧不上吗? 哈哈,在DUMP的分析旅程中&a…

提升工作效率:推荐几款实用的Mac项目管理工具!

在当今软件和技术高度发达的时代,项目管理依然是一项非常重要的任务。现在,有越来越多的人喜欢使用mac电脑进行项目管理,因为mac众所周知的稳定性和使用便捷性。但问题是,mac系统自带的项目管理工具并不是非常完美,因此…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义: 1.2举例: 1.3总结: 二.进程信号地使用: 2.1信号种类: 2.2而操作系统向进程发送信号地方式有四种: 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

Windows系统上安装Node.js图文步骤流程

Windows系统上安装Node.js图文步骤流程,本文以安装Node.js v4.4.3 LTS(长期支持版本)版本为例: 目录 Node.js下载 Windows 上安装 Node.js 1、Windows 安装包(.msi) 2、Windows 二进制文件 (.exe)安装 版本测试 Node.js下载 Node.js 安装包及源码…

nginx七层代理和四层转发的理解

先来理解一下osi七层模型 应用层 应用层是ISO七层模型的最高层,它直接与用户和应用程序交互,提供用户与网络的接口。它包括各种应用协议,如HTTP、FTP、SMTP等,用于实现特定应用的功能和通信表示层 表示层…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令,实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令,一…

leetcode 225.用队列实现栈

⭐️ 题目描述 🌟 leetcode链接:用队列实现栈 1️⃣ 思路和图解: push: 入栈操作只需要往不为空的队列入数据即可,如果都为空,其中任意一个队列都可以。 void myStackPush(MyStack* obj, int x) {// 往…

CS EXE上线主机+文件下载上传键盘记录

前言 书接上文,CobaltStrike_1_部署教程及CS制作office宏文档钓鱼教程,该篇介绍【使用CS生成对应exe木马,上线主机;对上线主机进行,文件下载,文件上传,键盘记录】。 PS:文章仅供学习…