我有一個包含多個粒子的 DataFrame,它們的組號 (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
然后我計算了粒子的面積并創建了一個 DataFrame(假設 1 像素 = 1 nm):
Particle # Size [pixel #] A [nm2]
1 1 10 10
2 2 1 1
3 3 3 3
4 4 4 4
現在我想計算粒子的直徑。但是,顆粒的形狀很復雜,因此我正在尋找一種計算平均直徑的方法(考慮到形狀不是完美的圓形),并在 A [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
任何幫助表示贊賞!
uj5u.com熱心網友回復:
我認為您正在尋找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。這些是通過在物件周圍擬合一個橢圓并測量定義它的長軸和短軸來計算的。
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442583.html
