import argparse import logging import re from multiprocessing import Process, Queue from pathlib import Path import numpy as np from skimage import exposure, filters from modules.config import logger from modules.volume import volume_loading_func, volume_saving_func def normalize_intensity( np_volume: np.ndarray, relative_path: Path, logger: logging.Logger ): logger.info(f"[processing start] {relative_path}") nstack = len(np_volume) stack: np.ndarray = np_volume[nstack // 2 - 16 : nstack // 2 + 16] hist_y, hist_x = exposure.histogram(stack[stack > 0]) thr = filters.threshold_otsu(stack[stack > 0]) peak_air = np.argmax(hist_y[hist_x < thr]) + hist_x[0] peak_soil = np.argmax(hist_y[hist_x > thr]) + (thr - hist_x[0]) + hist_x[0] np_volume = np_volume.astype(np.int64) for i in range(len(np_volume)): np_volume[i] = ( (np_volume[i] - peak_air).clip(0) / (peak_soil - peak_air) * 256 / 2 ) logger.info(f"[processing end] {relative_path}") return exposure.rescale_intensity( np_volume, in_range=(0, 255), out_range=(0, 255) ).astype(np.uint8) 请详细解释每一行的代码意思
时间: 2023-06-02 12:04:50 浏览: 155
使用JSONArray.fromObject所需要的jar包
这是一段 Python 代码,它进行了体积数据的预处理,具体解释如下:
```
import argparse # 用来解析命令行参数
import logging # 用来记录日志
import re # 用来进行正则表达式的匹配
from multiprocessing import Process, Queue # 用来进行并行计算
from pathlib import Path # 用来处理文件路径
import numpy as np # 用来处理数组数据
from skimage import exposure, filters # 用来进行图像处理
from modules.config import logger # 从 modules.config 模块中导入日志记录器
from modules.volume import volume_loading_func, volume_saving_func # 从 modules.volume 模块中导入一些函数
def normalize_intensity(np_volume: np.ndarray, relative_path: Path, logger: logging.Logger):
"""
对给定的 3D 图像进行归一化处理,返回归一化后的 3D 图像。
Args:
np_volume: 给定的 3D 图像,数据类型为 np.ndarray。
relative_path: 3D 图像在磁盘上的相对路径,数据类型为 Path。
logger: 用来记录日志的 Logger 对象,数据类型为 logging.Logger。
Returns:
进行归一化处理后的 3D 图像,数据类型为 np.ndarray。
"""
logger.info(f"[processing start] {relative_path}")
# 取中间的 32 张图像,作为计算阈值和峰值的输入
nstack = len(np_volume)
stack: np.ndarray = np_volume[nstack // 2 - 16 : nstack // 2 + 16]
# 使用 skimage 库中的直方图均衡化和 OTSU 二值化算法,得到背景和前景
hist_y, hist_x = exposure.histogram(stack[stack > 0])
thr = filters.threshold_otsu(stack[stack > 0])
peak_air = np.argmax(hist_y[hist_x < thr])
peak_soil = np.argmax(hist_y[hist_x > thr]) + (thr - hist_x[0])
# 对原始的 3D 数据进行归一化处理,将灰度值线性映射到 0-127 范围内
np_volume = np_volume.astype(np.int64)
for i in range(len(np_volume)):
np_volume[i] = ((np_volume[i] - peak_air).clip(0) / (peak_soil - peak_air) * 256 / 2)
logger.info(f"[processing end] {relative_path}")
# 对归一化后的 3D 图像进行再次线性映射,将灰度值映射到 0-255 范围内
return exposure.rescale_intensity(
np_volume, in_range=(0, 255), out_range=(0, 255)
).astype(np.uint8)
```
具体的注释在代码中已经给出。
阅读全文