【图像识别】openCV基础知识

news2024/12/24 8:44:29

图像处理基础

  • 一、使用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、保存

在这里插入图片描述

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

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

相关文章

多元回归预测 | Matlab基于麻雀算法(SSA)优化高斯过程回归(SSA-GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于麻雀算法(SSA)优化高斯过程回归(SSA-GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源…

合宙Air001震撼来袭!

Air001芯片特性 采用ARM 32位的M0内核,主频可达48MHz; 4K RAM32K Flash; 1.7~5.5V超宽范围供电,USB和电池都能直接供电; 内嵌可配4/8/16/22.12/24MHz的RC振荡器,无需外挂晶振就能48MHz运行…

你连存活到JDK8中著名的Bug都不知道,你怎么敢跳槽涨薪的?

在笔者研究 JDK 源码时,注意到在CopyOnWriteArrayList 和ArrayList 的构造器中都出现了如下 bug 字样 6260652 其实代表的JDK bug 列表中的编号 http://bugs.java.com/bugdatabase/view_bug.do?bug_id6260652 http://bugs.java.com/bugdatabase/view_bug.do?bug…

GBU808-ASEMI薄体整流桥GBU808

编辑:ll GBU808-ASEMI薄体整流桥GBU808 型号:GBU808 品牌:ASEMI 芯片个数:4 封装:GBU-4 恢复时间:≥2000ns 工作温度:-50C~150C 浪涌电流:200A 正向电流:8A 反…

Golang 命令源码文件

Go 语言标准库中专门用于接收和解析命令参数。这个代码包的名字叫 flag。 函数 flag.StringVar 接受 4 个参数。 第 1 个参数是用于存储该命令参数值的地址,具体到这里就是在前面声明的变量 name 的地 址了,由表达式 &name 表示。 第 2 个参数是为…

高级运维开发工程师带你处理linux木马(挖矿病毒)实战例子

一、事态描述 centos7测试服务器,突然密码登不上去了,然后CPU占100%。已经猜到,登录密码过于简单,密码被破解挂马了。大概率是CPU挖矿病毒。 二、重置centos7登录root密码 步骤1 启动Linux Centos7系统,当出现如下画…

JavaWeb JSP 内置对象

1.JSP 内置对象 在jsp自动转换成的java文件的service方法中,我们可以看到这九个内置对象: 具体如下: request(HttpServletRequest):代表客户端的HTTP请求。通过该对象,可以获取请求参数、请求…

时序区间预测 | Matlab基于高斯过程回归(GPR)时间序列区间预测,matlab代码,单变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列预测 | Matlab基于高斯过程回归(GPR)时间序列区间预测,matlab代码,单变量输入模型 评价指标包括:MAE、MBE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量…

【Spring Boot丨(十 )】日志

上文讲了 类型安全配置属性 本篇来讲一下 Spring boot 的默认日志相关 Logging 🍑 概述🍏 日志格式🍐 控制台输出🥥 文件输出🥝 文件轮换🍒 文件级别 🍑 概述 Spring Boot在所有内部日志中使用C…

支持裸耳3D空间音频?7月12日发布,荣耀Magic系列喜迎新成员

荣耀在7月12日将举办全场景新品发布会,其中将正式推出荣耀新款平板 MagicPad。 荣耀官方今天上午开始预热荣耀平板 MagicPad,官方海报文案表明这将成为首款支持裸耳3D空间音频的平板,引领行业潮流。 “空间音频技术”并不陌生,简…

git merge 与 git rebase 的区别

文章目录 前言1、使用 merge2、使用 rebase总结 前言 首先我们要清楚,git merge 与 git rebase 处理的问题是一样的,这两个命令都用于把一个分支的变更整合进另一个分支,只不过他们达成同样目的的方式不同。 刚开始,已经存在一…

Jmeter 做接口自动化测试的这些技巧你都掌握了吗

前言 JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,…

DBF文件的解析介绍

1.基本介绍 DBF是Digital Beam Forming的缩写,“.dbf”文件扩展名代表据库处理系统所产生的数据库文件,起初意为保存数据的文件是一个简单的表,可以使用ASCII字符集添加、修改、删除或打印数据,随着产品变得越来越流行&#xff0…

SIN65 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引(均为出厂默认值) 软件支持(驱动的详细使用帮助)一些常见问题解答(FAQ)首次使用步骤蓝牙配对规则(重要)蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

idea连接远程MySQL数据库

填写URL,以mysql为例 格式 jdbc:mysql://ip地址:端口号/数据库名 jdbc:mysql://127.0.0.1:3306/ldentification _Information

在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性

引言 作为全球领先的开源分布式 MQTT Broker,EMQX 在 5.0 版本中引入了 MQTT over QUIC,将 MQTT 协议的优势与 QUIC 的特性相结合。通过充分利用 QUIC 协议低连接开销和多路复用的特点,MQTT over QUIC 为弱网络环境和不规则网络中的用户提供…

lib/db 标准单元分类(Standard Cells in ASIC Design)、Track定义

文章目录 drain curruntThreshold Voltage (VTH)channel lengthtrack(Classification according to the Density)Standard Cell Layout drain currunt Drain current (Id) uCox(W/L)[(Vgs-Vth)Vds-(1/2)Vds^2] Coxepision/tox#饱和电流计算公式&#xf…

C#上位机开发广阔前景

作为一名C#上位机开发人员,我可以告诉你,C#是一门广泛使用的编程语言,在软件开发领域有很多机会和前途。以下是一些关于C#上位机开发的理由: 广泛应用:C#是微软的主要开发语言之一,被广泛用于开发各种类型…

Linux 性能优化(网络、磁盘、内存、日志监控)

文章目录 1、CPU性能监控1.2、平均负载基础1.3、平均负载与 CPU 使用率1.4、监控命令top命令mpstat命令pidstat场景一:CPU 密集型进程场景二:I/O 密集型进程场景三:大量进程的场景1.5、CPU上下文切换1.6、 遇到CPU利用率高该如何排查1.7、根据…

【java】获取前一天日期

//获取前一天日期//写法一LocalDate yesterday2 LocalDate.now().minusDays(1);System.out.println(yesterday2);//写法二LocalDate yes1 LocalDate.now().plusDays(-1);System.out.println(yes1);//输入当前日期的年 月 日System.out.println(LocalDate.now().getYear());…