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 11:04:44 浏览: 81
这段代码是一个用于对医学影像(volume)进行预处理的函数,主要用于对体积图像进行灰度值归一化操作,使得不同的体积图像在灰度值方面具有可比性,从而能够更好地进行后续的特征提取、分类等操作。
具体来说,该函数的输入参数包括体积图像(np_volume:np.ndarray)、体积图像的相对路径(relative_path:Path)以及一个日志记录器(logger: logging.Logger)。函数的输出是经过灰度值归一化处理的体积图像(np_volume)。
下面分别对每一行代码进行解释:
第一行引入了 argparse、logging、re、Process、Queue、Path、numpy 和 skimage.exposure、skimage.filters 等模块,这些模块在处理影像和日志记录等方面发挥了重要作用。
第三行定义了一个函数 normalize_intensity,接收输入 np_volume、relative_path 和 logger 三个参数。
第四行记录了日志,输出 "[processing start] " 字符串和相对路径。
第五至七行将输入的体积图像分成 32 个连续的切片构成一个数据堆栈。
第八至九行利用 skimage.exposure.histogram 函数获取切片中像素灰度值的直方图。thr = filters.threshold_otsu(stack[stack > 0]) 则使用 skimage.filters.threshold_otsu 函数来进行阈值分割,从而计算出灰度值区间中的阈值点。
第十至十二行则计算空气和土壤出现的灰度值峰值,从而能够进行灰度归一化操作。
第十三至十八行将体积图像(np_volume)强制类型转换为 int64 类型,并循环遍历每个切片。利用所有像素的灰度减去空气峰值后,再除以空气和土壤峰值的差,得出的结果即为像素的灰度值归一化结果。最后再将归一化操作后的像素重新转化为 uint8 类型。
第十九行记录了日志,输出 "[processing end] " 字符串和相对路径。
第二十行返回经过 rescale_intensity 函数处理之后的归一化体积图像(np_volume)。其中,rescale_intensity 是 skimage.exposure 模块下面负责强度(灰度值)缩放的函数,输入参数包括归一化前的像素灰度值范围、以及归一化后的像素灰度值范围。
阅读全文