Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将scikit图像轮廓存储在具有单个顶点和每行轮廓编号的数据帧中_Python_Pandas_Contour_Scikit Image_Enumerate - Fatal编程技术网

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的,是因为它直接作用于任意大小的轮廓(大多数情况下),即使我的问题中没有具体说明,如示例所示。