Skip to content

Commit 30cbc35

Browse files
author
Corentin
committed
reworking towards st demo
1 parent b44cfd2 commit 30cbc35

File tree

4 files changed

+54
-64
lines changed

4 files changed

+54
-64
lines changed

myoquant/src/ATP_analysis.py

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from skimage.measure import regionprops_table
33
from scipy.stats import gaussian_kde
44
from sklearn.mixture import GaussianMixture
5-
5+
from .common_func import extract_single_image, df_from_cellpose_mask
66
import numpy as np
77

88
labels_predict = {1: "fiber type 1", 2: "fiber type 2"}
@@ -12,13 +12,8 @@
1212
def get_all_intensity(image_array, df_cellpose):
1313
all_cell_median_intensity = []
1414
for index in range(len(df_cellpose)):
15-
single_cell_img = image_array[
16-
df_cellpose.iloc[index, 5] : df_cellpose.iloc[index, 7],
17-
df_cellpose.iloc[index, 6] : df_cellpose.iloc[index, 8],
18-
].copy()
15+
single_cell_img = extract_single_image(image_array, df_cellpose, index)
1916

20-
single_cell_mask = df_cellpose.iloc[index, 9].copy()
21-
single_cell_img[~single_cell_mask] = 0
2217
# Calculate median pixel intensity of the cell but ignore 0 values
2318
single_cell_median_intensity = np.median(single_cell_img[single_cell_img > 0])
2419
all_cell_median_intensity.append(single_cell_median_intensity)
@@ -95,19 +90,7 @@ def paint_full_image(image_atp, df_cellpose, class_predicted_all):
9590

9691

9792
def run_atp_analysis(image_array, mask_cellpose, intensity_threshold=None):
98-
props_cellpose = regionprops_table(
99-
mask_cellpose,
100-
properties=[
101-
"label",
102-
"area",
103-
"centroid",
104-
"eccentricity",
105-
"bbox",
106-
"image",
107-
"perimeter",
108-
],
109-
)
110-
df_cellpose = pd.DataFrame(props_cellpose)
93+
df_cellpose = df_from_cellpose_mask(mask_cellpose)
11194
class_predicted_all, intensity_all = predict_all_cells(
11295
image_array, df_cellpose, intensity_threshold
11396
)

myoquant/src/HE_analysis.py

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,27 @@
11
import numpy as np
22
import pandas as pd
33
from skimage.draw import line
4-
from skimage.measure import regionprops_table
5-
6-
from .draw_line import *
4+
from .common_func import (
5+
extract_single_image,
6+
df_from_cellpose_mask,
7+
df_from_stardist_mask,
8+
)
9+
from .draw_line import (
10+
line_equation,
11+
calculate_intersection,
12+
calculate_closest_point,
13+
calculate_distance,
14+
)
15+
import matplotlib.pyplot as plt
716

817

918
def extract_ROIs(histo_img, index, cellpose_df, mask_stardist):
10-
single_cell_img = histo_img[
11-
cellpose_df.iloc[index, 5] : cellpose_df.iloc[index, 7],
12-
cellpose_df.iloc[index, 6] : cellpose_df.iloc[index, 8],
13-
].copy()
14-
nucleus_single_cell_img = mask_stardist[
15-
cellpose_df.iloc[index, 5] : cellpose_df.iloc[index, 7],
16-
cellpose_df.iloc[index, 6] : cellpose_df.iloc[index, 8],
17-
].copy()
19+
single_cell_img = extract_single_image(histo_img, cellpose_df, index)
20+
nucleus_single_cell_img = extract_single_image(mask_stardist, cellpose_df, index)
1821
single_cell_mask = cellpose_df.iloc[index, 9]
19-
single_cell_img[~single_cell_mask] = 0
20-
nucleus_single_cell_img[~single_cell_mask] = 0
21-
22-
props_nuc_single = regionprops_table(
23-
nucleus_single_cell_img,
24-
intensity_image=single_cell_img,
25-
properties=[
26-
"label",
27-
"area",
28-
"centroid",
29-
"eccentricity",
30-
"bbox",
31-
"image",
32-
"perimeter",
33-
"feret_diameter_max",
34-
],
22+
df_nuc_single = df_from_stardist_mask(
23+
nucleus_single_cell_img, intensity_image=single_cell_img
3524
)
36-
df_nuc_single = pd.DataFrame(props_nuc_single)
3725
return single_cell_img, nucleus_single_cell_img, single_cell_mask, df_nuc_single
3826

3927

@@ -47,13 +35,20 @@ def single_cell_analysis(
4735
internalised_threshold=0.75,
4836
draw_and_return=False,
4937
):
38+
if draw_and_return:
39+
fig_size = (5, 5)
40+
f, ax = plt.subplots(figsize=fig_size)
41+
ax.scatter(x_fiber, y_fiber, color="white")
42+
5043
n_nuc, n_nuc_intern, n_nuc_periph = 0, 0, 0
5144
new_row_lst = []
5245
new_col_names = df_nuc_single.columns.tolist()
5346
new_col_names.append("internalised")
5447
new_col_names.append("score_eccentricity")
5548
new_col_names.append("cell label")
5649
for _, value in df_nuc_single.iterrows():
50+
if draw_and_return:
51+
ax.scatter(value[3], value[2], color="red")
5752
n_nuc += 1
5853
value = value.tolist()
5954
# Extend line and find closest point
@@ -69,6 +64,21 @@ def single_cell_analysis(
6964
m, b, (single_cell_img.shape[0], single_cell_img.shape[1])
7065
)
7166
border_point = calculate_closest_point(value[3], value[2], intersections_lst)
67+
if draw_and_return:
68+
ax.plot(
69+
(x_fiber, border_point[0]),
70+
(y_fiber, border_point[1]),
71+
"ro--",
72+
linewidth=1,
73+
markersize=1,
74+
)
75+
ax.plot(
76+
(x_fiber, value[3]),
77+
(y_fiber, value[2]),
78+
"go--",
79+
linewidth=1,
80+
markersize=1,
81+
)
7282
rr, cc = line(
7383
int(y_fiber),
7484
int(x_fiber),
@@ -96,6 +106,8 @@ def single_cell_analysis(
96106
value.append(ratio_dist)
97107
value.append(cell_label)
98108
new_row_lst.append(value)
109+
if draw_and_return:
110+
ax.scatter(coords[1], coords[0], color="red", s=10)
99111
break
100112
except IndexError:
101113
coords = list(zip(rr, cc))[index3 - 1]
@@ -115,8 +127,13 @@ def single_cell_analysis(
115127
value.append(ratio_dist)
116128
value.append(cell_label)
117129
new_row_lst.append(value)
130+
if draw_and_return:
131+
ax.scatter(coords[1], coords[0], color="red", s=10)
132+
ax.axis("off")
118133
break
119134
df_nuc_single_stats = pd.DataFrame(new_row_lst, columns=new_col_names)
135+
if draw_and_return:
136+
return n_nuc, n_nuc_intern, n_nuc_periph, df_nuc_single_stats, ax
120137
return n_nuc, n_nuc_intern, n_nuc_periph, df_nuc_single_stats
121138

122139

@@ -173,20 +190,7 @@ def paint_histo_img(histo_img, cellpose_df, prediction_df):
173190

174191

175192
def run_he_analysis(image_ndarray, mask_cellpose, mask_stardist, eccentricity_thresh):
176-
props_cellpose = regionprops_table(
177-
mask_cellpose,
178-
properties=[
179-
"label",
180-
"area",
181-
"centroid",
182-
"eccentricity",
183-
"bbox",
184-
"image",
185-
"perimeter",
186-
"feret_diameter_max",
187-
],
188-
)
189-
df_cellpose = pd.DataFrame(props_cellpose)
193+
df_cellpose = df_from_cellpose_mask(mask_cellpose)
190194
df_nuc_analysis, all_nuc_df_stats = predict_all_cells(
191195
image_ndarray, df_cellpose, mask_stardist, eccentricity_thresh
192196
)

myoquant/src/common_func.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from tensorflow import keras
1414
import numpy as np
1515
from PIL import Image
16+
from skimage.measure import regionprops_table
17+
import pandas as pd
1618

1719
# from .gradcam import make_gradcam_heatmap, save_and_display_gradcam
1820
from .random_brightness import RandomBrightness
@@ -148,9 +150,10 @@ def df_from_cellpose_mask(mask):
148150
return df_cellpose
149151

150152

151-
def df_from_stardist_mask(mask):
153+
def df_from_stardist_mask(mask, intensity_image=None):
152154
props_stardist = regionprops_table(
153155
mask,
156+
intensity_image=intensity_image,
154157
properties=[
155158
"label",
156159
"area",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "myoquant"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
description = "MyoQuant🔬: a tool to automatically quantify pathological features in muscle fiber histology images."
55
authors = ["Corentin Meyer <[email protected]>"]
66
maintainers = ["Corentin Meyer <[email protected]>"]

0 commit comments

Comments
 (0)