怎样分析一个网站做的好坏,360网站建设公司,刚刚封城最新消息2021,广东免费建站公司前言#xff1a;
Python的列表处理#xff0c;在机器视觉中经常被用到#xff0c;这里结合基本的概念机器视觉实践案例#xff0c;成文如下#xff1a;
本身将实现一个#xff0c;弧线的mask填充#xff1a;这个mask是我的一个天文项目的应用#xff0c;目的在于将月… 前言
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(fWidth: {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(fWidth: {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 列表 | 菜鸟教程