Skip to content

Commit 27fcd4e

Browse files
committed
Added the ability to filter output data by particle size parameters
1 parent 3e5274a commit 27fcd4e

File tree

8 files changed

+434
-225
lines changed

8 files changed

+434
-225
lines changed

particleanalyzer/core/ImagePreprocessor.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@
1212

1313

1414
class ImagePreprocessor:
15+
processing_profiles = {
16+
"640x640": (640, 640),
17+
"1024x1024": (1024, 1024),
18+
"1280x1280": (1280, 1280),
19+
"1600x1600": (1600, 1600),
20+
"2048x2048": (2048, 2048),
21+
"Оригинал": None,
22+
}
23+
1524
def __init__(self, output_dir: str = "output", lang="ru"):
16-
self._processing_profiles = {
17-
"640x640": (640, 640),
18-
"1024x1024": (1024, 1024),
19-
"1280x1280": (1280, 1280),
20-
"1600x1600": (1600, 1600),
21-
"2048x2048": (2048, 2048),
22-
"Оригинал": None,
23-
}
2425
self.output_dir = output_dir
2526
self.lang = lang
2627
os.makedirs(self.output_dir, exist_ok=True)
@@ -59,7 +60,7 @@ def preprocess_image(
5960
self._save_image_metadata(image, request)
6061

6162
# Изменение размера
62-
image, scale_factor_glob = self._resize_image(image, solution, sahi_mode)
63+
image, scale_factor_glob = self.resize_image(image, solution, sahi_mode)
6364

6465
# Конвертация цветовых пространств
6566
orig_image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
@@ -79,15 +80,18 @@ def _convert_image_channels(self, image: np.ndarray) -> np.ndarray:
7980
return cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
8081
return image
8182

82-
def _resize_image(
83-
self, image: np.ndarray, solution: str, sahi_mode: bool
83+
@staticmethod
84+
def resize_image(
85+
image: np.ndarray,
86+
solution: str,
87+
sahi_mode: bool,
8488
) -> np.ndarray:
8589
"""Изменяет размер изображения согласно выбранному профилю."""
8690
if solution == "Оригинал" or sahi_mode:
8791
return image, 1
8892

89-
if solution in self._processing_profiles:
90-
max_w, max_h = self._processing_profiles[solution]
93+
if solution in ImagePreprocessor.processing_profiles:
94+
max_w, max_h = ImagePreprocessor.processing_profiles[solution]
9195
h, w = image.shape[:2]
9296

9397
if h > max_h or w > max_w:
@@ -107,8 +111,6 @@ def _resize_image(
107111
cv2.resize(image, new_size, interpolation=cv2.INTER_AREA),
108112
scale_factor_glob,
109113
)
110-
if image is None or (isinstance(image, np.ndarray) and image.size == 0):
111-
gr.Info(self._get_translation("Ошибка: изображение отсутствует..."))
112114
return image, 1
113115

114116
def _save_image_metadata(self, image: np.ndarray, request: gr.Request) -> None:

particleanalyzer/core/ParticleAnalyzer.py

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,15 @@ def _create_error_return(self) -> Tuple:
123123
gr.update(visible=False),
124124
gr.update(visible=False),
125125
gr.update(visible=False),
126+
None,
127+
None,
128+
None,
129+
None,
130+
None,
131+
None,
132+
None,
133+
None,
134+
gr.update(visible=False),
126135
)
127136

128137
def analyze_image(
@@ -236,6 +245,21 @@ def analyze_image(
236245
lang=self.lang,
237246
)
238247
stats_df = builder.build_stats_table()
248+
d_max_max = stats_df.data.iloc[1, 3] + stats_df.data.iloc[0, 3] * 0.01
249+
d_max_min = stats_df.data.iloc[1, 4]
250+
d_min_max = stats_df.data.iloc[2, 3] + stats_df.data.iloc[1, 3] * 0.01
251+
d_min_min = stats_df.data.iloc[2, 4]
252+
theta_max_max = stats_df.data.iloc[4, 3] + stats_df.data.iloc[4, 3] * 0.01
253+
theta_max_min = stats_df.data.iloc[4, 4]
254+
theta_min_max = stats_df.data.iloc[5, 3] + stats_df.data.iloc[5, 3] * 0.01
255+
theta_min_min = stats_df.data.iloc[5, 4]
256+
S_max = stats_df.data.iloc[6, 3] + stats_df.data.iloc[6, 3] * 0.01
257+
S_min = stats_df.data.iloc[6, 4]
258+
P_max = stats_df.data.iloc[7, 3] + stats_df.data.iloc[7, 3] * 0.01
259+
P_min = stats_df.data.iloc[7, 4]
260+
I_max = stats_df.data.iloc[9, 3] + stats_df.data.iloc[9, 3] * 0.01
261+
I_min = stats_df.data.iloc[9, 4]
262+
239263
pbar.update(1)
240264

241265
pbar.set_description(self._get_translation("Построение графиков..."))
@@ -252,6 +276,25 @@ def analyze_image(
252276
gr.update(visible=segment_mode),
253277
gr.update(visible=api_key),
254278
gr.update(visible=True),
279+
gr.update(minimum=d_max_min, maximum=d_max_max, value=(d_max_min, d_max_max), label=f"Dₘₐₓ [{self._get_translation(scale_selector['unit'])}]"),
280+
gr.update(minimum=d_min_min, maximum=d_min_max, value=(d_min_min, d_min_max), label=f"Dₘₐₓ [{self._get_translation(scale_selector['unit'])}]"),
281+
gr.update(
282+
minimum=theta_max_min, maximum=theta_max_max, value=(theta_max_min, theta_max_max)
283+
),
284+
gr.update(
285+
minimum=theta_min_min, maximum=theta_min_max, value=(theta_min_min, theta_min_max)
286+
),
287+
gr.update(minimum=0, maximum=1, value=(0, 1)),
288+
gr.update(
289+
minimum=S_min, maximum=S_max, value=(S_min, S_max), label=f"S [{self._get_translation(scale_selector['unit'])}²]"
290+
),
291+
gr.update(
292+
minimum=P_min, maximum=P_max, value=(P_min, P_max), label=f"P [{self._get_translation(scale_selector['unit'])}]"
293+
),
294+
gr.update(
295+
minimum=I_min, maximum=I_max, value=(I_min, I_max)
296+
),
297+
gr.update(visible=True),
255298
)
256299
except Exception as e:
257300
self._handle_error(e)
@@ -591,6 +634,7 @@ def get_feret(contour, angles=np.arange(0, 180, 1)):
591634
f'I [{self._get_translation("ед.")}]': round(
592635
mean_intensity, config["round_value"]
593636
),
637+
"points": points.tolist(),
594638
}
595639
)
596640

@@ -627,14 +671,13 @@ def _draw_feret_lines(self, image, contour, angle, color=(0, 255, 0), thickness=
627671
image, tuple(pt1.astype(int)), tuple(pt2.astype(int)), color, thickness
628672
)
629673

674+
@staticmethod
630675
def _get_scaled_thickness(
631-
self,
632676
image_width: int,
633677
image_height: int,
634678
base_width: int = 300,
635679
base_thickness: int = 1,
636680
) -> int:
637-
"""Вычисление толщины линии в зависимости от разрешения"""
638681
if image_width < base_width or image_height < base_width:
639682
return 1
640683
return max(1, int(base_thickness * (image_width / base_width)))

particleanalyzer/core/languages.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
Я – ваш виртуальный ассистент в сканирующей электронной микроскопии. Готов провести детальный анализ морфологии и размерных характеристик частиц.""": """🔬 **Добро пожаловать в систему анализа SEM-изображений!**
131131
Я – ваш виртуальный ассистент в сканирующей электронной микроскопии. Готов провести детальный анализ морфологии и размерных характеристик частиц.""",
132132
"Видео инструкция": "Видео инструкция",
133+
"Параметры фильтрации": "Параметры фильтрации",
133134
},
134135
"en": {
135136
"Подготовка...": "Initializing...",
@@ -248,6 +249,7 @@
248249
Я – ваш виртуальный ассистент в сканирующей электронной микроскопии. Готов провести детальный анализ морфологии и размерных характеристик частиц.""": """🔬 **Welcome to the SEM Image Analysis System!**
249250
I am your virtual assistant for scanning electron microscopy. Ready to perform detailed analysis of particle morphology and size characteristics.""",
250251
"Видео инструкция": "Video instructions",
252+
"Параметры фильтрации": "Filtering Options",
251253
},
252254
"zh-cn": {
253255
"Подготовка...": "初始化中...",
@@ -366,6 +368,8 @@
366368
Я – ваш виртуальный ассистент в сканирующей электронной микроскопии. Готов провести детальный анализ морфологии и размерных характеристик частиц.""": """🔬 **欢迎使用扫描电镜图像分析系统!**
367369
我是您的电子显微镜虚拟助手,可对颗粒形貌和尺寸特征进行详细分析。""",
368370
"Видео инструкция": "视频说明",
371+
"Параметры фильтрации": "过滤选项",
372+
369373
},
370374
"zh-tw": {
371375
"Подготовка...": "初始化中...",
@@ -492,6 +496,7 @@
492496
Я – ваш виртуальный ассистент в сканирующей электронной микроскопии. Готов провести детальный анализ морфологии и размерных характеристик частиц.""": """🔬 **歡迎使用掃描式電子顯微鏡影像分析系統!**
493497
我是您的電子顯微鏡虛擬助手,可對顆粒形貌和尺寸特徵進行詳細分析。""",
494498
"Видео инструкция": "影片說明",
499+
"Параметры фильтрации": "過濾選項",
495500
},
496501
}
497502

0 commit comments

Comments
 (0)