使用Python focus-stacking工具时遭遇IndexError: list index out of range错误
操作场景
使用focus-stack工具处理TIFF格式图像,在Linux虚拟环境中执行命令:
focusstack -i /projectnb/npbssmic/ac25/focus_stacking/Zstack -otest.png
报错信息
INFO:focus_stack.focus_stack:reading images
INFO:focus_stack.focus_stack:aligning images
Traceback (most recent call last):
File "/projectnb/npbssmic/ac25/.conda/envs/pytorch_env/bin/focusstack", line 33, in
sys.exit(load_entry_point('focus-stack', 'console_scripts', 'focusstack')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/projectnb/npbssmic/ac25/focus_stacking/focus-stack/focus-stack/focus_stack/run.py", line 58, in main
stacked = stacker.focus_stack(image_files)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/projectnb/npbssmic/ac25/focus_stacking/focus-stack/focus-stack/focus_stack/focus_stack.py", line 41, in focus_stack
images = self._align_images(image_matrices)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/projectnb/npbssmic/ac25/focus_stacking/focus-stack/focus-stack/focus_stack/focus_stack.py", line 84, in _align_images
aligned_imgs.append(images[0])
~~~~~~^^^
IndexError: list index out of range
源码分析
查看focus_stack核心代码,推测是cv2.imread()读取目录文件失败,导致image_matrices为空列表:
def focus_stack(self, image_files: List[str]) -> np.ndarray: """Pipeline to focus stack a list of images.""" image_matrices = self._read_images(image_files) images = self._align_images(image_matrices) laplacian = self._compute_laplacian(images) focus_stacked = self._find_focus_regions(images, laplacian) return focus_stacked @staticmethod def _read_images(image_files: List[str]) -> List[np.ndarray]: """Read the images into numpy arrays using OpenCV.""" logger.info("reading images") return [cv2.imread(img) for img in image_files]
目录情况
目标目录/projectnb/npbssmic/ac25/focus_stacking/Zstack下包含多个TIFF格式图像文件(如zstack_0001.tif等)
排查与解决方案
1. OpenCV缺少TIFF读取支持
OpenCV的cv2.imread()默认可能无法识别16位或特殊编码的TIFF文件,需安装TIFF支持库:
conda install -c conda-forge opencv-tiff
也可改用PIL/Pillow读取图像后转成OpenCV兼容格式,修改_read_images方法:
from PIL import Image import numpy as np @staticmethod def _read_images(image_files: List[str]) -> List[np.ndarray]: """Read the images into numpy arrays using PIL.""" logger.info("reading images") imgs = [] for img_path in image_files: with Image.open(img_path) as img: # 转换为OpenCV默认的BGR通道顺序 img_np = np.array(img.convert("RGB"))[:, :, ::-1] imgs.append(img_np) return imgs
2. 工具未正确匹配TIFF文件
focus-stack可能默认只识别常见图像后缀,需明确指定TIFF文件:
focusstack -i /projectnb/npbssmic/ac25/focus_stacking/Zstack/*.tif -otest.png
3. 文件权限不足
检查当前用户对TIFF文件的读取权限:
ls -l /projectnb/npbssmic/ac25/focus_stacking/Zstack/
若权限不足,执行以下命令修改:
chmod +r /projectnb/npbssmic/ac25/focus_stacking/Zstack/*.tif
内容的提问来源于stack exchange,提问作者ac25

