Python机器视觉:01- 利用列表和切片操作 - 做一个弧线和图片相交的mask区域

 前言:

Python的列表处理,在机器视觉中经常被用到,这里结合基本的概念+机器视觉实践案例,成文如下:

本身将实现一个,弧线的mask填充:这个mask是我的一个天文项目的应用,目的在于将月球从图中抠出来。


 

1 基础概念 - 序列:

序列是 Python 中最基本的数据结构。

序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。

1.1 python 序列的类型

Python 有 6 个序列的内置类型,但最常见的是列表和元组。

 1.1.1 列表:[List]

列表是最常见的序列类型之一,它是可变的,意味着你可以添加、删除或修改其中的元素。列表使用方括号[]表示,并包含一系列以逗号分隔的值。列表中的元素可以包含不同的数据类型,不需要全部相同。列表提供了11个内置方法,用于添加、删除、查找元素等操作。

# 定义一个列表 
my_list = [1, 'apple', 3.14, True]
# 打印列表 
print(my_list)

 

 

1.1.1.1  访问列表的索引

 

#!/usr/bin/python3list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )
print( list[1] )
print( list[2] )

 red
green
blue

 1.1.1.2 从后面反向索引

#!/usr/bin/python3list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )
print( list[-2] )
print( list[-3] )

 black
white
yellow

  1.1.1.3 用下标访问列表中的值
#!/usr/bin/python3nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[0:4])
[10, 20, 30, 40]
 

 

  1.1.1.3 截取和拼接

1.1.2  元祖(Tuple)

元组与列表类似,也是一个序列类型,但是元组是不可变的,一旦创建就不能修改。元组使用小括号()表示,也可以包含逗号分隔的值。与列表不同,元组没有提供内置的方法,但可以转换为列表进行操作

# 定义一个元组 
my_tuple = (1, 'apple', 3.14, True)
# 打印元组 
print(my_tuple)

 

 

 

 1.1.3 字符串 “string”

字符串是一个不可变的序列类型,用于处理文本数据。字符串使用单引号'或双引号"表示,可以包含一系列字符。字符串中的字符可以是字母、数字、标点符号等

# 定义一个字符串 
my_string = "Hello, World!"
# 打印字符串 
print(my_string)

 1.1.4 其他不常用。

Unicode字符串

Unicode字符串与字符串类似,也是不可变的序列类型,但它支持多字节字符编码,可以表示全球各地的语言字符。Unicode字符串使用三个单引号'''或三个双引号"""

# 定义一个Unicode字符串 
my_unicode = """你好,世界!"""
# 打印Unicode字符串 
print(my_unicode)

缓冲区对象(Buffer Object)

缓冲区对象是一个较不常见的序列类型,它主要用于低级编程,如文件操作或内存映射。缓冲区对象使用方括号[]表示,但内部是通过缓冲区接口进行操作的13。

xrange对象

xrange对象是一个生成器类型,它用于生成一个整数序列。与列表不同,xrange不会占用大量的内存空间,它只生成序列的一部分。xrange对象使用三个参数表示范围,如xrange(start, stop, step)

 

# 使用xrange生成一个序列 
for i in xrange(10):print(i)

 


2 实践:

2.1 获取一个图片的四个顶点

2.1.1 拿到图片的尺寸

对应彩色的图片,通过如下的代码,可以先获取图片的尺寸:

import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')# 获取图像尺寸
height, width, channels = image.shape# 打印尺寸信息
print(f'Width: {width}, Height: {height}, Channels: {channels}')

 【案,

在OpenCV中,可以通过多种方式获取图像的尺寸信息。当你使用 cv2.imread() 函数读取图像后,图像会被存储在一个NumPy数组中,你可以通过该数组的 shape 属性来获取图像的尺寸。

对于彩色图像,shape 属性返回一个三元组 (height, width, channels),分别表示图像的高度、宽度和通道数(RGB三个颜色通道)。对于灰度图像,它返回的是二元组 (height, width),因为灰度图像只有一个通道。】

【案,这里图像的属性通过元祖来表示,原因是元祖他可以集成多种数据格式,同时元祖是不可以改变的】

import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)# 获取图像尺寸
height, width = image.shape# 打印尺寸信息
print(f'Width: {width}, Height: {height}')

 【图像是灰度图像,那么 channels 将不存在】

2.1.2 拿到图片的四个顶点

上小节,拿到尺寸后,我们通过这个嵌套的列表,来表示图片的四个顶点坐标,

    # 获取矩形框的四个角点corners = np.array([[0, 0],[width - 1, 0],[width - 1, height - 1],[0, height - 1]])

那么,如果是右侧的顶点
 

    # 获取矩形框的右侧两个角点right_corners = np.array([[width - 1, 0],[width - 1, height - 1]])

2.2 构建一个弧段(含和图片的交点)这里略-将在其他章节介绍

假设弧段的点集为:

arc_points 

 我们可以拿到弧的起始点的坐标。

交点为:

intersection_points

2.3 现在构建mask区域

要构建一个mask,就必须构建一个封闭的区域。简单的想法,就是通过弧与图像边界的交点,来构建。

 # 构建一个封闭区域,包括弧段和右侧顶点polygon_points = np.vstack((arc_points, [arc_end_point], right_corners, [arc_start_point]))# 填充封闭区域为白色cv2.fillPoly(mask, [polygon_points], (255))

但是,问题出来,很明显,在构建MASK区域的时候,顶点的选择,由于顺序的问题,发生了交叉,大家可以看到下面的图片,因为交叉,所以,就出现,下面这个交织的情况。

而,我们希望是将弧段+边界构成MASK区域。 

 【案,问题的根源就是,我们构建参考点的时候,点的选取顺序也许发生了问题,

【案,这个图的标号,反映了红色错误的情况,和绿色正确的情况】

 于是,我们有了下面的修改,

 # 构建一个封闭区域,包括弧段和右侧顶点polygon_points = np.vstack((arc_points, [arc_end_point], right_corners[::-1], [arc_start_point]))# 填充封闭区域为白色cv2.fillPoly(mask, [polygon_points], (255))

【案,这里将构建封闭区域的点,构成一个封闭的点集,然后,利用fillPoly函数进行填充,形成mask】

【这里, right_corners[::-1] 反转了右侧顶点的顺序,这里就要用到我们前面关于python的列表的高级应用知识】


理论和实践的结合

  • right_corners: 这是一个变量名,代表一个列表或数组。这个列表中存储着一些表示右侧顶点的元素。
  • [::-1]: 这是Python列表切片的一种特殊用法,用于反转列表。

切片操作的详细解释:

  • :: 表示从列表的开头开始。
  • :: 表示到列表的末尾结束。
  • -1: 表示步长为-1,即从后向前取元素。

 

结合起来看:

  • right_corners[::-1] 的意思是:从 right_corners 列表的末尾开始,以步长-1的方式,一直取到列表的开头,从而形成一个新的列表,这个新列表中的元素顺序与原列表正好相反。
示例:
假设 right_corners 的值为 [1, 2, 3, 4],那么 right_corners[::-1] 的结果就是 [4, 3, 2, 1]。

调整结果:

 


参考:

Python3 列表 | 菜鸟教程

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

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

相关文章

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个? const 有了变量先给const,如果发现它后面是要被修改的,再改为let 1.2 为什么const声明的对象可以修改里面的属性? 因为对象是引用类型,里面存储的是地址&#x…

自动驾驶核心技术:感知融合、规划决策、控制执行

1、前言 简单来说,实现自动驾驶需要解决三个核心问题:“我在哪?我要去哪?我该如何去?”能完整解决这三个问题就是真正的自动驾驶。 目前,自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以…

大学生就业招聘:Spring Boot系统的设计与实践

5系统详细实现 5.1 用户模块的实现 5.1.1 求职信息管理 大学生就业招聘系统的用户可以管理自己的求职信息,可以对自己的求职信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 求职信息管理界面 5.1.2 首页 用户登录可以在首页看到招聘信息展示也一些求职…

Flet介绍:平替PyQt的好用跨平台Python UI框架

随着Python在各个领域的广泛应用,特别是在数据科学和Web开发领域,对于一个简单易用且功能强大的用户界面(UI)开发工具的需求日益增长。传统的Python GUI库如Tkinter、PyQt虽然功能强大,但在易用性和现代感方面略显不足…

算法篇1:双指针思想的运用(1)--C++

一.算法解析 双指针,顾名思义就是两个指针,常见的算法中,我们可以看到两种: 1.对撞指针:一般用于顺序结构,也称为左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端…

比较搜索难度曲线5s1-4和4s1

在行列可自由变换的条件下,平面上的5点结构只有34个,4点结构有16个 (A,B)---6*n*2---(0,1)(1,0) 让B全是0。当收敛误差为7e-4,收敛199次取迭代次数平均值。让隐藏层节点数n分别为10,15,20,25,30&#xff…

C(十四)while、for、do-while循环综合(一)

uu们,小弟我本科在读,文章我会一直坚持更新下去,包括但不限于C初阶、C进阶、数据结构、C、Linux、MySQL、项目、QT开发、各种算法(之后会持续更新),并且站在小白的视角尽可能通俗易懂地把这些写出来&#x…

【Android】获取备案所需的公钥以及签名MD5值

目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章:【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle(app&…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合,这是因为工科要求都必须是8开头的专业课,里面参考课本还是没变的,无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app

uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说,project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具,使用venv可以为每个项目创建一个独立的环境:python -m venv myprojectenv (项目名后e…

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

ROS同步解包 引言1 鱼香ROS一键安装ros-docker脚本:2 指定目录映射3 数据解包3.1 解包脚本3.2 依赖安装3.3 运行脚本,解包 引言 总结步骤如下: 采集同步数据:ROS录制(推荐),或者代码同步触发采…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今,iOS 用户现在可以毫不费力地删除背景,而无需复杂的应用程序。在这篇文章中,您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

通信工程学习:什么是IP网际协议

IP:网际协议 IP网际协议(Internet Protocol,简称IP)是整个TCP/IP协议栈中的核心协议之一,它负责在网络中传送数据包,并提供寻址和路由功能。以下是对IP网际协议的详细解释: 一、对IP网际协议的…

哈尔滨自闭症学校寄宿条件与优势解析

自闭症儿童的希望之光:广州星贝育园寄宿制学校深度解析 在当今社会,自闭症儿童作为一群需要特别关注和照顾的群体,其教育与康复问题日益受到社会各界的重视。自闭症儿童不仅需要专业的康复训练,还需要一个稳定、温馨且充满爱的环…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…