Python 如何将scikit图像轮廓存储在具有单个顶点和每行轮廓编号的数据帧中
我使用的是一个修改版本的,从图像分水岭分割产生的边缘创建轮廓。在这个结果中,每个级别只有一个由行-列索引对组成的轮廓 在演示中很容易显示轮廓。但是我想做的是使用Python 如何将scikit图像轮廓存储在具有单个顶点和每行轮廓编号的数据帧中,python,pandas,contour,scikit-image,enumerate,Python,Pandas,Contour,Scikit Image,Enumerate,我使用的是一个修改版本的,从图像分水岭分割产生的边缘创建轮廓。在这个结果中,每个级别只有一个由行-列索引对组成的轮廓 在演示中很容易显示轮廓。但是我想做的是使用enumerate循环将每个轮廓的每个顶点附加到一个数据帧,分离行和列索引,然后在一个单独的列中添加一个级别/轮廓索引 为了说明这一点,我将从一个小玩具示例开始,其中每个轮廓只有一个索引。使用此代码: np.random.seed(131) test = np.random.randint(50, size=5) n_list = []
enumerate
循环将每个轮廓的每个顶点附加到一个数据帧,分离行和列索引,然后在一个单独的列中添加一个级别/轮廓索引
为了说明这一点,我将从一个小玩具示例开始,其中每个轮廓只有一个索引。使用此代码:
np.random.seed(131)
test = np.random.randint(50, size=5)
n_list = []
t_list = []
for n, t in enumerate(test):
n_list.append(n)
t_list.append(t)
contours_df = pd.DataFrame({'contour': n_list, 'contour': t_list})
contours_df
我得到这个数据帧:
更具代表性的例子如下:
np.random.seed(131)
test1 = np.random.randint(50, size=(5, 2, 2))
n_list1 = []
t_list1 = []
for n1, t1 in enumerate(test1):
n_list1.append(n1)
t_list1.append(t1)
contours_df1 = pd.DataFrame({'contour': n_list1, 'points': t_list1})
contours_df1
# using XlsxWriter documentation example
writer = pd.ExcelWriter('contours_df1.xlsx', engine='xlsxwriter')
contours_df1.to_excel(writer, sheet_name='Sheet1')
writer.save()
这给了我这个数据帧:
我可以使用XlsxWriter
将其导出到Excel文件,如下所示:
np.random.seed(131)
test1 = np.random.randint(50, size=(5, 2, 2))
n_list1 = []
t_list1 = []
for n1, t1 in enumerate(test1):
n_list1.append(n1)
t_list1.append(t1)
contours_df1 = pd.DataFrame({'contour': n_list1, 'points': t_list1})
contours_df1
# using XlsxWriter documentation example
writer = pd.ExcelWriter('contours_df1.xlsx', engine='xlsxwriter')
contours_df1.to_excel(writer, sheet_name='Sheet1')
writer.save()
要获得此信息:
但我真正想要的是分割轮廓,以便得到类似这样的最终Excel输出:
你几乎达到了目标,你只需要玩一玩: 该方法按预期工作。当我们枚举一个iterable python对象时,我们得到对象元素之间的
1-1
关联和一个“指针”,范围从0
到len(iterable\u对象)-1
请从文档中查看此示例: 现在,实现您在这里向我们展示的内容的一种方法是使用从
枚举
生成的指针2次,并相应地分割每个测试
元素的内容:
np.random.seed(131)
test1 = np.random.randint(50, size=(5, 2, 2))
contour_lst = []
row_lst = []
column_lst = []
for n, t_elem in enumerate(test1):
# First square coordinates for this contour.
contour_lst.append(n)
row_lst.append(t_elem[0][0])
column_lst.append(t_elem[0][1])
# Second square coordinates for this contour.
contour_lst.append(n)
row_lst.append(t_elem[1][0])
column_lst.append(t_elem[1][1])
contours_df1 = pd.DataFrame({
'contour': contour_lst,
'row': row_lst,
'column': column_lst,
})
我会使用熊猫连接。对于大小合理的数据,是否为每列建立一个列表(尽管需要第二个嵌套循环以允许任意大小的等高线)是一个品味问题。对于较大的数据,我认为这种方法应该更快,因为它尽可能使用NumPy/pandas矢量化 下面是一个例子:
import numpy as np
import pandas as pd
contours = [np.random.random((i, 2)
for i in np.random.randint(3, 10, size=5)]
dataframes = []
for contour_id, contour in enumerate(contours):
current_dataframe = pd.DataFrame(contour, columns=['row', 'column'])
current_dataframe['contour'] = contour_id
dataframes.append(current_dataframe)
contours_data = pd.concat(dataframes)
contours_data.to_excel('filename.xlsx', sheet_name='Sheet1')
旁注:如果你只写一张纸,你不需要创建一个ExcelWriter。+1获得一个好的答案,并在
枚举
上增加额外的位。我真的可以选择目前为止收到的任何一个问题。我之所以选择Juan的,是因为它直接作用于任意大小的轮廓(大多数情况下),即使我的问题中没有具体说明,如示例所示。