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.rhkb.cn/news/439329.html

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

相关文章

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第2关---8G 显存玩转书生大模型 Demo

学员闯关手册:https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频:https://www.bilibili.com/video/BV18x4y147SU/ 课程文档: https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/rea…

基于Zynq SDIO WiFi移植三(支持2.4/5G)

应用问题-WIFI作为AP-hostapd多次连接 设备作为WIFI热点时,连接出现了下述问题: 1 手机连接需要三次,三次都需要输入密码; 2 平板连接需要三次,三次都需要输入密码; 3 电脑连接需要一次,无感…

24个AI写作秘技,助你写出震撼人心的佳作!

最近,许多朋友开始尝试使用AI进行写作。然而,他们创作的文章常常显得语言过于正式,不仅缺乏沉浸感,发送后也很容易被系统检测出重复内容。我一直强调,在写作过程中,我们不应完全依赖AI。AI只是一种工具&…

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域,[ComfyUI]Flux以其独特的虚实结合技术,已经成为艺术家和设计师们手中的利器。今天,我们激动地宣布,[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品,经典中文元素通过AI技术重现,包…

RabbitMQ(死信队列)

一、本文抒写背景 前面我也在延迟队列篇章提到过死信队列,也提到过一些应用场景! 今天呢,这篇文章,主要就是实战一个业务场景的小Demo流程,哈哈,那就是延迟关闭订单。 二、开始啦!letgo! 首…

No.0 笔记 | 从小白到入门:我的渗透测试笔记

嘿,小伙伴们!好久不见啊,是不是都以为我失踪了?😂 其实呢,最近一直在埋头苦学,感觉自己就像是在技术的海洋里游泳,每天都在吸收新知识。现在终于有时间冒个泡,跟大家分享…

小红书制作视频如何去原视频音乐,视频如何去原声保留背景音乐?

在视频编辑、音乐制作或个人娱乐中,有时我们希望去掉视频中的原声(如对话、解说等),仅保留背景音乐。这种处理能让观众更加聚焦于视频的氛围或节奏,同时也为创作者提供了更多创意空间。选择恰当的背景音乐,…

【记录】Excel|Excel 打印成 PDF 页数太多怎么办

【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题 文章目录 【记录】Excel|解决 Excel 打印成 PDF 页数过多的问题方法一:调整页边距WPS OfficeMicrosoft Excel 方法二:优化页面布局调整列宽和行高使用“页面布局”视图合并单…

小程序-使用npm包

目录 Vant Weapp 安装 Vant 组件库 使用 Vant 组件 定制全局主题样式 API Promise化 1. 基于回调函数的异步 API 的缺点 2. 什么是 API Promise 化 3. 实现 API Promise 化 4.调用 Promise 化之后的异步 API 小程序对 npm 的支持与限制 目前,小程序中已经…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件,确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下,我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…

JAVA开源项目 旅游管理系统 计算机毕业设计

本文项目编号 T 063 ,文末自助获取源码 \color{red}{T063,文末自助获取源码} T063,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现

0.前情提要 之前的po已经说了单独的邮箱验证码发送功能怎么实现: https://blog.csdn.net/qq_61551948/article/details/142641495 这篇说下如何把该功能整合到瑞吉项目里面,也就是把原先项目里的短信发送验证码的功能改掉,改为邮箱发送验证…

前端学习第一天笔记 HTML5 CSS初学以及VSCODE中的常用快捷键

前端学习笔记 VsCode常用快捷键列表HTML5标题标签标签之段落、换行、水平线标签之图片图片路径详解标签之超文本链接标签之文本列表标签之有序列表列表标签之无序列表标签之表格表格之合并单元格Form表单表单元素文本框 密码框 块元素与行内元素(内联元素&#xff0…

阿里云部署1Panel(失败版)

官网脚本部署不成功 这个不怪1panel,这个是阿里Linux 拉不到docker的下载源,懒得思考 正常部署直接打开官网 https://1panel.cn/docs/installation/online_installation/ 但是我使用的阿里云os(Alibaba Cloud Linux 3.2104 LTS 64位) 我执行不管用啊装不上docker 很烦 curl -s…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…

SPARK调优:AQE特性(含脑图总结)

学完AQE需要能够回答如下的几个问题: 什么是AQE?AQE的实现原理是什么?AQE的特性有哪些?使用什么参数实现?AQE每个特性可以解决什么问题?什么问题是AQE不能解决的 HL:学习脑图如下 SparkAQE是spa…

【2024版本】Mac/Windows IDEA安装教程

IDEA 2024版本真的很强大,此外JDK发布了最新稳定版 JDK21 ,只有新版本支持JDK 21、JDK22。原来数据库插件不支持redis等一些NoSql的数据库的连接,如果要使用需要自己单独装收费的插件。直接打开idea就很吃内存了,再打开其他一大堆…

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

C++游戏开发详解:从入门到实践

目录 引言 使用C进行游戏开发的优势 常用的C游戏引擎和工具 C游戏引擎比较 开发工具 C游戏开发核心概念与代码示例 面向对象编程&#xff08;OOP&#xff09; 封装 继承 多态 内存管理 手动内存管理 智能指针 内存池 并发编程 多线程 同步机制 游戏开发流程 …