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 17:04:41 浏览: 76
详解Python logging调用Logger.info方法的处理过程
这段代码是一个函数normalize_intensity,用于对一个numpy数组进行强度的归一化处理,可以接受三个参数: np_volume表示输入的numpy数组,relative_path表示处理的数据路径,logger表示日志输出的logger对象。下面是代码每行的说明:
1. import argparse - 导入argparse模块
2. import logging - 导入logging模块
3. import re - 导入re模块
4. from multiprocessing import Process, Queue - 导入Process和Queue类,用于多进程处理
5. from pathlib import Path - 导入Path类,用于简化路径操作
6. import numpy as np - 导入numpy模块,用于操作数组
7. from skimage import exposure, filters - 导入exposure和filters模块,用于图像处理
8. from modules.config import logger - 导入logger对象
9. from modules.volume import volume_loading_func, volume_saving_func - 导入volume_loading_func和volume_saving_func函数,用于数据加载和保存
10. def normalize_intensity( np_volume: np.ndarray, relative_path: Path, logger: logging.Logger ): - 定义函数normalize_intensity,接受三个参数:np_volume表示输入的numpy数组,relative_path表示处理的数据路径,logger表示日志输出的logger对象
11. logger.info(f"[processing start] {relative_path}") - 输出日志,表示开始处理相应路径的数据
12. nstack = len(np_volume) - 计算输入numpy数组的长度
13. stack: np.ndarray = np_volume[nstack // 2 - 16 : nstack // 2 + 16] - 对输入numpy数组进行切片操作,取其中心16层进行处理
14. hist_y, hist_x = exposure.histogram(stack[stack > 0]) - 使用exposure模块计算中心16层图像的直方图
15. thr = filters.threshold_otsu(stack[stack > 0]) - 使用filters模块计算图像的Otsu阈值
16. peak_air = np.argmax(hist_y[hist_x < thr]) - 找到直方图中小于阈值的像素值的最大直方图值对应的位置
17. hist_x[0] - 直方图的起点
18. peak_soil = np.argmax(hist_y[hist_x > thr]) - 找到直方图中大于阈值的像素值的最大直方图值对应的位置
19. (thr - hist_x[0]) - 计算直方图的阈值和起点的差值
20. hist_x[0] - 直方图的起点
21. np_volume = np_volume.astype(np.int64) - 将输入numpy数组转换为int64类型
22. for i in range(len(np_volume)): - 遍历整个数组
23. np_volume[i] = ( (np_volume[i] - peak_air).clip(0) / (peak_soil - peak_air) * 256 / 2 ) - 对每个元素进行强度归一化处理,公式为:(当前像素值-空气峰值)取0和空泥峰值和空气峰值的差值进行clip(裁剪操作),再除以空泥峰值和空气峰值的差值,最后乘以256/2
24. logger.info(f"[processing end] {relative_path}") - 输出日志,表示处理相应路径的数据已结束
25. return exposure.rescale_intensity( np_volume, in_range=(0, 255), out_range=(0, 255) ).astype(np.uint8) - 使用exposure模块对强度进行重新缩放,使强度范围在0-255之间,并将数组类型转换为uint8类型,最后返回处理后的numpy数组
阅读全文