机器学习:opencv图像识别--图片专项

news2024/11/15 8:33:44

目录

前言

一、读取图片

1.安装opencv库

2.读取彩色图片

3.读取灰度图

二、RGB

1.RGB的概念

2.颜色通道:

3.图像表示

4.代码实现单通道图像

三、ROI

1.代码实现

四、图片打码

五、图片组合

六、图片缩放

总结


前言

        OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,用于图像处理、视频分析、机器学习等任务。它提供了大量的函数和工具,帮助开发者进行图像处理和计算机视觉应用。

 

一、读取图片

1.安装opencv库

最好安装3.4及之前的版本,新版本可能会有版权问题

 

2.读取彩色图片

代码:

import cv2

"--------------------读取图片-------------------"
a = cv2.imread('suda.jpg')
cv2.imshow('suda', a)  # 显示图片 第一个参数,给显示框命名
b = cv2.waitKey(0)    # 显示时间 单位毫秒  0一直显示 键盘任意按键结束 返回按键的ascll码值
print(b)
cv2.destroyAllWindows()   # 关闭所有窗口

print("图片的形状", a.shape)
print("图像数据类型", a.dtype)
print("图像大小", a.size)

输出:

图片的形状 (940, 940, 3)
图像数据类型 uint8
图像大小 2650800

 

3.读取灰度图

代码:

import cv2

"--------------------读取灰度图------------------"
a = cv2.imread('suda.jpg', cv2.IMREAD_GRAYSCALE)  # 读取的时候转换成灰度图进行读取 IMREAD可以用0替换
# img = cv2.imread('suda.jpg')
# a = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('suda', a)  # 显示图片 第一个参数,给显示框命名
b = cv2.waitKey(0)  # 显示时间 单位毫秒  0一直显示 键盘任意按键结束 返回按键的ascll码值
print(b)
cv2.destroyAllWindows()  # 关闭所有窗口

print("图片的形状", a.shape)
print("图像数据类型", a.dtype)
print("图像大小", a.size)

'''保存图片'''
cv2.imwrite('suda_GRAY.jpg', a)

输出:

  • 可以看到图片的形状变成了一维
  • 图像大小变成了彩色图片的三分之一
图片的形状 (940, 940)
图像数据类型 uint8
图像大小 883600

 

二、RGB

1.RGB的概念

        RGB 是一种颜色表示模型,用于图像和视频处理中。RGB 代表红色(Red)、绿色(Green)和蓝色(Blue)三个颜色通道,通过调整这三种颜色的强度来生成其他颜色。每种颜色通道的强度通常用一个整数值表示,范围从0到255。

 

2.颜色通道

  • 红色通道(R):控制红色的强度。
  • 绿色通道(G):控制绿色的强度。
  • 蓝色通道(B):控制蓝色的强度。

 

3.图像表示

  • 在数字图像处理中,每个像素的颜色通常由三个数值表示,这三个数值分别对应于红色、绿色和蓝色通道的强度。
  • 例如,一个像素的颜色为(128,64,32)表示红色强度为128,绿色强度为64,蓝色强度为32。

 

4.代码实现单通道图像

  • 为什么这样读取单色通道,因为每个图像是由三张不同的单色通道的图叠加而成的
  • 直接显示单色通道图会呈现类似灰度图的样子,因为此时默认另外两个通道的值为255,会有很大影响
  • 当把另外两个通道的值变成0时,即可输出正常的单色图像
  • 最后还有使用cv2.merge()函数实现多通道合并
import cv2

# 读取图像
a = cv2.imread('suda.jpg')

# 提取颜色通道
# b = a[:, :, 0]  # 蓝色通道
# g = a[:, :, 1]  # 绿色
# r = a[:, :,2]  # 红色
# 分离通道
b, g, r = cv2.split(a)

# 显示单通道的图像  灰度
cv2.imshow('result', b)  # 显示为灰度图的样子 因为取单通道时其他通道默认值为255 调成0才显示单颜色
cv2.waitKey(10000)
cv2.destroyAllWindows()

# 显示单通道图像  单色
a_new = a.copy()
a_new[:, :, 1] = 0  # 将绿色通道设置为0
a_new[:, :, 2] = 0  # 将红色通道设置为0
cv2.imshow('result', a_new)  # 显示为单色
cv2.waitKey(10000)
cv2.destroyAllWindows()

'''合并颜色通道'''
img = cv2.merge((b, g, r))  # 图片通道数只能是1,3,4
cv2.imshow('result', img)  # 显示为单色
cv2.waitKey(10000)
cv2.destroyAllWindows()
  • 未将另外两个通道的值设置为0时,默认255的效果:

  • 将另外两个通道的值设置为0时的效果:

  • 合并颜色通道的效果:

 

 

三、ROI

        "ROI" 在图像处理中代表“感兴趣区域”(Region of Interest)。它是图像中的一个特定区域,人为取出图像中的某个区域。

1.代码实现

  • 代码很简单
  • 实质是取图片数组中的某个部分,形成新的显示
import cv2

a = cv2.imread("suda.jpg")
b = a[100:600, 100:600]
cv2.imshow('pic', a)
cv2.imshow('sec', b)
cv2.waitKey(10000)
cv2.destroyAllWindows()

 

四、图片打码

  • 实质是用随机像素组成的矩阵替换图片中某一块矩阵的像素
import cv2
import numpy as np

# 图片打码
a = cv2.imread('suda.jpg')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))
"""
两边矩阵大小须一致
np.random.randint(0, 256, (100, 100, 3)) 生成一个形状为 (100, 100, 3) 的随机整数数组
这些随机整数在 [0, 256) 范围内(即从0到255),通常用于表示RGB图像的像素值
(100, 100, 3) 表示生成一个100行100列的像素区域,每个像素有三个通道(R、G、B)
"""
cv2.imshow('pic', a)
cv2.waitKey(10000)
cv2.destroyAllWindows()

输出:

 

五、图片组合

  • 本质是用一张图片的某一部分取替换另一张图片的某一部分
# 图片组合
a = cv2.imread('suda.jpg')
b = cv2.imread('figure_0_9.png')
a[200:300, 300:500] = b[300:400, 500:700]  # 将a的一部分替换为b的一部分 两边矩阵大小须一致
cv2.imshow('pic', a)
cv2.imshow('sec', b)
cv2.waitKey(10000)
cv2.destroyAllWindows()

输出:

 

六、图片缩放

  • 有两种方法:
    • 一种是直接设定新图片的宽高
    • 另一种是使用resize设定新图片与原图片的比例
# 图片缩放
""" 
cv2.resize
src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型
dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像
fx:沿x轴的缩放倍数
fy:沿y轴的缩放倍数
"""
a = cv2.imread('suda.jpg')
a_new = cv2.resize(a, (200, 600))  # 设置宽、高
# a_new = cv2.resize(a, dsize=None, fx=0.5, fy=0.5)
print(a.shape)  # 高、宽、通道数
cv2.imshow('pic', a)
cv2.imshow('sec', a_new)
cv2.waitKey(10000)
cv2.destroyAllWindows()

输出:

  • 这是设置宽高

  • 这是设置比例

 

总结

        opencv库的功能十分强大,这只是其中一部分,后续还会介绍其他的功能

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

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

相关文章

Linux:Linux多线程

目录 线程概念 什么是线程 二级页表 线程的优点 线程的缺点 线程异常 线程用途 Linux进程VS线程 进程和线程 进程的多个线程共享 进程和线程的关系 Linux线程控制 POSIX线程库 线程创建 线程等待 线程终止 分离线程 线程ID及进程地址空间布局 线程概念 什么…

【CAN总线测试】——CAN数据链路层测试

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 2.1.位时间 2.2.采样点测试 2.3.CAN报文ID和DLC一致性检查 2.4.预期帧接收测试 2.5.非预期帧接收测试 2.6.总线负载率 1.位时间 用例编号 TG2_TC1 测试目…

android aar适配uniapp

最近有商户需要接入我们sdk,但是我们都是android或者ios原生的,直接用又不能用,需要做适配,本文就教你一步步实现android aar适配uniapp。 官方参考教程:开发者须知 | uni小程序SDK 但是官方写的比较繁琐,好…

计算机毕业设计选题推荐-Cosplay论坛系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

代码随想录训练营day27|455.分发饼干,376.摆动序列,53. 最大子序和

分发饼干 题目 思路:把最大的饼干分给胃口最大的人,所以可以先对两个数组进行排序,然后用双指针从后往前依次比较。如果饼干能成功头尾,就让饼干组的指针往前移 int biscs.size()-1; int ig.size()-1;//小孩组 for(;i>0;i--…

【摆脱被360安全卫士荼毒:使用这2个软件就够了】

保持电脑健康从拒绝使用360安全卫士开始 提示:不使用360安全卫士,电脑更健康 游戏本被360卫士荼毒的差点报废,感觉在使用360安全卫士后,笔记本的散热风扇很暴躁,笔记本经常高温不退,若你也有这样的烦恼&am…

单元格里显示曲线

想要实现的效果如下&#xff1a;表格每一行都有一个曲线 TreeList与GridControl的设置方法类似。 1、先创建控件的数据源&#xff0c;我使用的是DataTable /// <summary>/// 生成一个DataTable/// </summary>/// <returns></returns>public static Da…

【c++】强制类型转化

一、前言 在C语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。 新类型的强制转换可以提供更好的控制强制转换过程&#xff0c;允许控制各种不同种类的强制转换。 C中风格是static_cast<type>(c…

进阶SpringBoot之 SpringSecurity(2)用户认证和授权

Spring Security 官网 Spring Security 是针对 Spring 项目的安全框架 也是 Spring Boot 底层安全模块默认的技术选型 它可以实现强大的 Web 安全控制 只需引入 spring-boot-starter-security 模块&#xff0c;进行少量配置&#xff0c;即可实现强大的安全管理 几个重要的…

首款国产“3A”游戏《黑神话:悟空》爆火,背后有哪些AI技术在助力?

近日&#xff0c;沉淀了4年的首款国产“3A”游戏《黑神话悟空》正式在各大游戏交易平台上线。 据市场研究公司VG Insights 周四晚间发布预估数据&#xff0c;《黑神话&#xff1a;悟空》自发售以来&#xff0c;三天内在 Steam 平台的销量已突破 840 万份&#xff0c;好评率超 …

速腾32线激光雷达使用方法

速腾32线激光雷达 12V电源 实体机ubuntu22.04 ROS2-humble 一、软件安装 mkdir robosense_ws cd robosense_wsmkdir src && cd src/ git clone https://github.com/RoboSense-LiDAR/rslidar_msg.git git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.gi…

数学基础(六)

一、分布 正态分布 二项式分布 均匀分布 卡方分布 二、核函数 核函数的目的&#xff1a; 将低维数据转换为高维数据 线性核函数&#xff1a; Linear核函数对数据不做任何变换 当特征已经比较丰富了&#xff0c;样本数据量巨大&#xff0c;需要进行实时得出结果时进行使用…

【GH】【EXCEL】P3: Set Conditional Formatting To Excel Data By Gh

文章目录 conditional formattingdata sourceConditional ScaleConditional Scale Conditional PercentConditional Top Percent Conditional AverageConditional Average Multiple ConditionsConditional BarConditional Bar Conditional UniqueConditional Unique Conditiona…

JUC7-共享模型之工具

线程池 自定义线程池 import lombok.extern.slf4j.Slf4j; import org.springframework.core.log.LogDelegateFactory;import java.util.ArrayDeque; import java.util.Deque; import java.util.HashSet; import java.util.concurrent.TimeUnit; import java.util.concurrent.l…

git常用操作合集

1 撤销 1.1 适用场景 如果在git上提交了commit&#xff0c;但是当前提交的代码有问题&#xff0c;需要回退到上个版本 1.2 操作命令 1、git log 查看历史提交记录及对应的commit id 找到需要回退的commit id 2、执行git reset回退到之前的状态 git reset --hard <commi…

BaseCTF [第一周]Ez Xor

笔记。 64ida打开。 走&#xff01; 逆向逆向&#xff0c;逆向往前看。 因为异或算法&#xff0c;A ^BC >>> C^BA 所以在只需要知道密钥key就可以了。 是不是头大&#xff1f; 没事 这里介绍另一种方法>>> IDA 动态调试去获取key值、密文值 。(灵活使用工…

编写程序调用元神操作系统的API

1. 背景 本文介绍了元神操作系统API的调用&#xff0c;并详细介绍了“调用元神系统API读取磁盘扇区”程序的编写以及测试结果。 2. 方法 &#xff08;1&#xff09;元神操作系统API的调用方法 元神操作系统0.4版beta4开始提供了对OS功能的调用&#xff0c;调用相关的定义如…

整形提升

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 整型提升 (Integral Promotion)是指在计算机编程中&#xff0c;当不同类型的整数类型进行运算时&#xff0c;较小类型的整数会被自动转换为更大类型的整数&#xff0c;以确保运算的正确进行。这种类型转换主…

【生日视频制作】公司前台接待文化形象墙字写字楼办公室AE模板修改文字软件生成器教程特效素材【AE模板】

公司前台形象墙写字楼办公室生日视频制作教程AE模板修改文字素 怎么如何做的【生日视频制作】公司前台接待文化形象墙字写字楼办公室AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染…

STM32寄存器操作、模板构建

目录 外设寄存器查找 ① 名称② 偏移地址③ 寄存器位表④ 位功能说明寄存器基本操作 C语言的置位和清零 具体方法设置GPIO流程给寄存器赋值带参数宏STM32F1xx 芯片识别存储器映射寄存器映射让GPIOB端口的16个引脚输出高电平&#xff0c;要怎么实现&#xff1f;STM32寄存器映射…