《深度学习》 OpenCV 计算机视觉入门 (中篇)

news2024/11/15 8:55:17

目录

一、OpenCV函数使用

1、改变像素值

2、图像切片合并

1)直接截取相加

2)使用cv2.add合并

3)此时亮度太高了,需要降低亮度

3、边界填充

1)常数填充

2)镜面反射填充(复制交界处)

3)镜面反射填充(删除交界处)

4)边框像素值代替

5)边框上下左右像素替换

4、阈值处理

1)cv2.THRESH_BINARY

2)cv2.THRESH_BINARY_INV

3)cv2.THRESH_TRUNC

4)cv2.THRESH_TOZERO

5)cv2.THRESH_TOZERO_INV

6)展示代码

二、总结

1、图片的切片(Image Slicing)

2、边界填充(Boundary Padding)

3、阈值处理(Thresholding)


一、OpenCV函数使用

1、改变像素值

        通过赋值语句增加或者减去像素值

import cv2  # 导入库
a = cv2.imread('girl.jpg')  # 导入图像
b = a + 10  # 将图片所有像素值增加10
cv2.imshow('aa',b)  # 展示图片
cv2.waitKey(10000)
cv2.destroyAllWindows()

运行结果如下:    (图片来源网络,如若侵权敬请联系删除)

2、图像切片合并

1)直接截取相加
a = cv2.imread('girl.jpg')  # 读取a、b两张图片
b = cv2.imread('girl1.jpg')
c = a[100:400,200:600] + b[300:600,200:600]  # 截取一部分图片合并到一张图片中,截取大小必须一致
cv2.imshow('a+b',c)  # 展示图片
cv2.waitKey(10000)
cv2.destroyAllWindows()

2)使用cv2.add合并
a = cv2.imread('girl.jpg')  # 读取a、b两张图片
b = cv2.imread('girl1.jpg')
c = cv2.resize(a,(600,400))  # 分别截取两张图片中相同尺寸图片
d = cv2.resize(b,(600,400))
e = cv2.add(c,d)  # 将截取出的两个图片合并
cv2.imshow('c+d',e)
cv2.waitKey(10000)
cv2.destroyAllWindows()

运行结果为:

3)此时亮度太高了,需要降低亮度

        只需在上述代码中增加下面这一部分即可

cc = cv2.addWeighted(c,0.5,d,0.5,10)  # 亮度为10,改变为其50%
cv2.imshow('cc',cc)
cv2.waitKey(10000)
cv2.destroyAllWindows()

其运行结果为:

3、边界填充

        使用方法 cv2.copyMakeBorder(),更改参数来完成不同填充

1)常数填充

        borderType=cv2.BORDER_CONSTANT

import cv2
b = cv2.imread('girl1.jpg')
a = cv2.resize(b,(400,600))
top,bottom,left,right = 50,50,50,50


# 增加页边框像素为常数,需在给一个给定参数,value为像素值
constant = cv2.copyMakeBorder(a,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(0,250,0))
cv2.imshow("constant",constant)
cv2.waitKey(0)

运行结果为:

2)镜面反射填充(复制交界处)

  borderType = cv2.BORDER_REFLECT

只需要将上述后续部分更改为下列代码即可

reflect = cv2.copyMakeBorder(a,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
cv2.imshow("reflect",reflect)
cv2.waitKey(0)

运行结果如下:

3)镜面反射填充(删除交界处)

  borderType=cv2.BORDER_REFLECT101

reflect101 = cv2.copyMakeBorder(a,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
cv2.imshow("reflect101",reflect101)
cv2.waitKey(0)

运行结果如下:

4)边框像素值代替

  borderType=cv2.BORDER_REPLICATE

replicate = cv2.copyMakeBorder(a,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
cv2.imshow("replicate",replicate)
cv2.waitKey(0)

运行结果如下:

5)边框上下左右像素替换

  borderType=cv2.BORDER_WRAP

wrap = cv2.copyMakeBorder(a,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow("wrap",wrap)
cv2.waitKey(0)

运行结果如下:

4、阈值处理

        使用函数 cv2.threshold( )通过调整其内参数更改图像阈值

1)cv2.THRESH_BINARY

        大于阈值的像素点设置为maxval,小于等于阈值的像素点设置为0。

2)cv2.THRESH_BINARY_INV

        大于阈值的像素点设置为0,小于等于阈值的像素点设置为maxval。

3)cv2.THRESH_TRUNC

        大于阈值的像素点设置为阈值,小于等于阈值的像素点保持原值不变。

4)cv2.THRESH_TOZERO

        大于阈值的像素点保持原值不变,小于等于阈值的像素点设置为0。

5)cv2.THRESH_TOZERO_INV

        大于阈值的像素点设置为0,小于等于阈值的像素点保持原值不变。

6)展示代码
import cv2
img1 = cv2.imread('girl1.jpg',cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img1,(600,400))
# 像素值大于150,将其转变为255,小于等于150的转变为0
ret,binary = cv2.threshold(img,150,255,cv2.THRESH_BINARY)
# 像素值大于150,转变成0,小于等于150的转变为255
ret1,binaryinv = cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)
# 像素值大于150,转变成150,小于等于150的保持不变
ret2,trunc = cv2.threshold(img,150,255,cv2.THRESH_TRUNC)
# 像素值大于150,保持不变,小于等于150的设置为0
ret3,tozero = cv2.threshold(img,150,255,cv2.THRESH_TOZERO)
# 像素值大于150,设置为0,小于等于150的保持不变
ret4,tozeroinv = cv2.threshold(img,150,255,cv2.THRESH_TOZERO_INV)

cv2.imshow('a',binary)
cv2.imshow('b',binaryinv)
cv2.imshow('c',trunc)
cv2.imshow('d',tozero)
cv2.imshow('e',tozeroinv)

cv2.waitKey(0)

运行结果为:

二、总结

1、图片的切片(Image Slicing)

        图片的切片是指将图片分割成多个部分,可以按照不同的方式进行切片,如按照固定大小切片、按照特定的行和列切片或者按照特定的区域切片。图片的切片可以用于图像分析、目标检测和图像处理等应用。

2、边界填充(Boundary Padding)

        边界填充是指在图片周围添加额外的像素或颜色,以扩展图片的边界。常见的边界填充方法包括零填充(Zero Padding)、复制填充(Replicate Padding)和镜像填充(Mirror Padding)。边界填充可以用于保持图像的大小一致性、避免边界信息的丢失和减小边缘处理的影响。

3、阈值处理(Thresholding)

        阈值处理是指将灰度图像转换为二值图像,根据预设的阈值将像素分为两类:大于阈值的像素置为一类,小于阈值的像素置为另一类。阈值处理常用于图像分割、边缘检测和目标提取等应用。常见的阈值处理方法包括全局阈值处理、自适应阈值处理和多阈值处理。

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

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

相关文章

论文仍在苦恼?分享最实用6款AI论文工具网站的汇总!

论文写作是学术研究中的重要环节,然而,面对繁重的写作任务,许多学者和学生常常感到力不从心。幸运的是,随着人工智能技术的飞速发展,一系列AI论文写作工具应运而生,极大地简化了论文写作流程,提…

【Mybatis】介绍+搭建+参数传递+增删改查操作+事务与连接池

目录 一. Mybatis介绍 二. Mybatis搭建 1. 导入Mybatis依赖的jar包 2. 创建Mybatis全局配置文件 3. 定义一个接口 4. 创建sql映射文件 5. 测试 * MyBatisX插件安装 三. 数据库连接池 四. 参数传递 1. 将数据封装到对象中 2. 使用Param注解 五. 数据库事务 六.…

11、Redis高级:Key设置、BigKey解决、批处理优化、集群下批处理、慢查询

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过…

【golang学习之旅】复杂数据类型——切片(slice)

系列文章 【golang学习之旅】使用VScode安装配置Go开发环境 【golang学习之旅】报错:a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 p…

OpenHarmony实战开发: unittest单元测试的编写

背景 程序开发与单元测试二者密不可分,是每个开发人员的基本业务。当功能性代码开发完成后,要自行测试其是否满足设计预期,如果不满足就要回去完善代码,满足则可以提交功能代码及测试用例。 测试用例的另一个重要作用就是阅读者…

【USRP】 Link 16 战术数据链 实训系统

Link 16 战术数据链 实训系统 一、基于USRP的Link16平台简介1、整体架构2、JTIDS终端架构3、平台特点3.1、提高技术理解与应用能力3.2、培养创新思维与问题解决能力3.3、加强跨学科融合与团队合作 4、平台建设4.1、基础理论教学模块4.2、LabVIEW 算法模块4.3、USRP仿真模块4.4、…

如何用ChatGPT快速提升论文质量:实用技巧大公开

近年来,人工智能技术急速发展,尤其在自然语言处理领域取得了显著进展。作为OpenAI推的一款先进的语言模型,ChatGPT不仅在日常交互中表现卓越,也在专业写作领域显示了巨大的潜力。本文旨在详尽介绍如何高效运用ChatGPT来撰写和修改…

JWT双令牌认证实现无感Token自动续约

概念 JSON Web Token (JWT)是一个开放标准(RFC 7519) ,它定义了一种紧凑和自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。此信息可以进行验证和信任,因为它是经过数字签名的。JWT 可以使用机密(使用 HMAC 算法)或使用 RSA 或 E…

LeetCode --- 411周赛

题目列表 3258. 统计满足 K 约束的子字符串数量 I 3259. 超级饮料的最大强化能量 3260. 找出最大的 N 位 K 回文数 3261. 统计满足 K 约束的子字符串数量 II 一、统计满足K约束的子字符串数量I 这种要求满足区间内某种性质的题,一般都可以用滑动窗口来做。这题…

STM32MP157_uboot_初次编译

STM32MP157_uboot_初次编译 前言: 为了快速入门,这边选择直接使用正点原子提供的uboot源码,先体验一下uboot的编译流程,为后面的移植原厂uboot做环境准备。 1、获取正点原子的uboot源码(复制到虚拟机里面) …

均值漂移算法原理及Python实践

均值漂移算法(Mean Shift Algorithm)是一种基于密度的非参数聚类算法,其原理主要基于核密度估计和梯度上升方法。以下是均值漂移算法原理的详细解析: 1. 基本思想 均值漂移算法的基本思想是通过迭代地更新数据点的位置&#xff…

Android APK优化系列瘦身篇:实战一个APK从11MB压缩到4MB,APK无用资源去除与代码压缩、混淆,瘦身维度的选型分析

目录: 为什么要进行APK瘦身呢?APK瘦身主要是瘦身哪些呢? a. 优化resources.arsc: b. res优化 c. lib优化 d. 资源优化,代码混淆和压缩总结 一、为什么要进行APK瘦身呢? 减少下载时间和流量消耗&#xff1…

el-table 表格自定义添加表格数据后自动滚动到最底部

动态表格,可以新增行列数,为了用户体验,新增后超出表格流体高度后,自动滚动到最下方 需要element-plus如下api 代码如下: const addCapacity () > {inputList.value.push({name: "",desc: "&quo…

案例-登录认证

案例-登录认证 登录认证。 最终实现的效果就是用户必须登录之后,才可以访问后台系统中的功能。 1. 登录功能 1.1 需求 在登录界面中,我们可以输入用户的用户名以及密码,然后点击 “登录” 按钮就要请求服务器,服务端判断用户输入…

streamlit创建python的web应用

目录 简介基本示例:运行 Streamlit 应用: 简介 Streamlit 是一个开源的 Python 库,可以让你快速创建和分享自定义的 Web 应用,尤其适用于机器学习和数据科学项目。它简化了将数据脚本转换为交互式应用的过程,不需要任…

【案例54】登录显示ORA-28000 账户被锁定

问题现象 登录后显示ora-28000 账户被锁定 问题分析 ORA-28000 表示账户被锁定。 错误原因分析 1、密码多次输入错误:这是最常见的导致账户锁定的原因之一。用户在尝试登录数据库时,如果连续多次输入错误的密码,数据库系统为了安全起见&am…

sheng的学习笔记-AI-生成式方法

AI目录:sheng的学习笔记-AI目录-CSDN博客 需要额外的知识对应连接: EM:sheng的学习笔记-AI-EM算法-CSDN博客 贝叶斯: sheng的学习笔记-AI-贝叶斯(Bayesian)分类-CSDN博客 高斯混合模型:shen…

利用Matlab求解常微分方程(dsolve与ode45)

1.微分方程的基本概念 含义微分方程(英语:Differential equation,DE)是一种数学方程,用来描述某一类函数与其导数之间的关系。微分方程的通解是一个符合方程的函数。而在初等数学的代数方程里,解析解是一个…

RocketMQ~刷盘机制、主从复制方式、存储机制

刷盘机制 生产者发布MQ给Brocker,Brocker在存储这些数据的时候,需要进行刷盘,分为同步刷盘和异步刷盘。 在同步刷盘中需要等待一个刷盘成功的ACK,同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响…

推荐5款能够写出高质量文章的ai写作工具!

在如今的信息爆炸时代,内容创作者面临着前所未有的挑战:如何快速而高质量地产生内容,满足日益增长的读者群需求。 无论是自媒体人士、博客作者、学者还是学生,大家都在寻找一种能够提升写作效率与质量的解决方案。 幸运的是&…