Py学习  »  Python

df中像素的复杂形状的平均直径,Python

fred • 3 年前 • 1323 次点击  

我有一个由多个粒子组成的数据框,它们得到了如下的组号(1,2,3,4):

Groups: 
 [[0 0 0 1 1 1 0 0]
 [0 2 0 1 1 1 0 0]
 [0 0 0 1 1 1 0 0]
 [0 0 0 0 1 0 0 0]
 [0 3 3 0 0 4 0 0]
 [0 3 0 0 0 4 0 0]
 [0 0 0 0 0 4 0 0]
 [0 0 0 0 0 4 0 0]]
Number of particles: 4

然后,我计算了粒子的面积,并创建了一个数据帧(假设1像素=1纳米):

   Particle #  Size [pixel #]  A [nm2]  
1           1              10       10     
2           2               1        1     
3           3               3        3     
4           4               4        4     

现在我想计算粒子的直径。然而,粒子的形状是复杂的,因此我正在寻找一种方法来计算平均直径(考虑到形状不是完美的圆形),并在[nm2]旁边添加另一个具有平均直径的列。

这可能吗?

以下是我的完整代码:

import numpy as np
from skimage import measure
import pandas as pd

final = [
    [0, 0, 0, 255, 255, 255, 0, 0],
    [0, 255, 0, 255, 255, 255, 0, 0],
    [0, 0, 0, 255, 255, 255, 0, 0, ],
    [0, 0, 0, 0, 255, 0, 0, 0],
    [0, 255, 255, 0, 0, 255, 0, 0],
    [0, 255, 0, 0, 0, 255, 0, 0],
    [0, 0, 0, 0, 0, 255, 0, 0],
    [0, 0, 0, 0, 0, 255, 0, 0]
]

final = np.asarray(final)

groups, group_count = measure.label(final > 0, return_num = True, connectivity = 1)
 
print('Groups: \n', groups)
print(f'Number of particles: {group_count}')

df = (pd.DataFrame(dict(zip(['Particle #', 'Size [pixel #]'],
                            np.unique(groups, return_counts=True))))
        .loc[lambda d: d['Particle #'].ne(0)]
     )

pixel_nm_size = 1*1

df['A [nm2]'] = df['Size [pixel #]'] * pixel_nm_size

感谢您的帮助!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133875
 
1323 次点击  
文章 [ 2 ]  |  最新文章 3 年前
mozway
Reply   •   1 楼
mozway    3 年前

IIUC,您可以使用自定义函数查找边界框的高度/宽度,并计算两个尺寸的平均值:

def get_diameter(g):
    a = (groups==g)
    h = (a.sum(1)!=0).sum()
    w = (a.sum(0)!=0).sum()
    return (h+w)/2


df['diameter'] = df['Particle #'].map(get_diameter)

输出:

   Particle #  Size [pixel #]  A [nm2]  diameter
1           1              10       10       3.5
2           2               1        1       1.0
3           3               3        3       2.0
4           4               4        4       2.5
warped
Reply   •   2 楼
warped    3 年前

我想你在找 regionprops .

特别是 equivalent_diameter ,或只是 perimeter .

props = measure.regionprops_table(groups, properties = ['label', 'equivalent_diameter', 'perimeter'])
df = pd.DataFrame(props)

编辑

从文件中:

equivalent_diameter_area: float
The diameter of a circle with the same area as the region.

因此,该函数获取标记的区域,测量该区域,并用该区域构造一个圆(每个区域只有一个这样的圆)。 然后测量圆的直径。

你也可以看看 major_axis_length minor_axis_length .这些是通过在物体周围拟合一个椭圆并测量定义它的长轴和短轴来计算的。