使用skimage进行圆形检测时遭遇循环导入错误的排查求助
问题
尝试使用skimage运行基础圆形检测功能时出现循环导入错误,使用的代码导入模块如下:
import cv2 import numpy as np from skimage.feature import peak_local_max from skimage.segmentation import watershed from scipy import ndimage
运行时触发以下报错:
File "C:\Users\myfile\circle_recognition.py", line 7, in <module> from skimage.feature import peak_local_max File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\feature\__init__.py", line 4, in <module> from ._cascade import Cascade File "skimage/feature/_cascade.pyx", line 20, in init skimage.feature._cascade File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\transform\__init__.py", line 4, in <module> from .radon_transform import (radon, iradon, iradon_sart, File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\transform\radon_transform.py", line 6, in <module> from ._warps import warp File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\transform\_warps.py", line 9, in <module> from ..measure import block_reduce File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\measure\__init__.py", line 6, in <module> from ._polygon import approximate_polygon, subdivide_polygon File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\measure\_polygon.py", line 2, in <module> from scipy import signal File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\__init__.py", line 211, in __getattr__ return _importlib.import_module(f'scipy.{name}') File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\signal\__init__.py", line 323, in <module> from ._filter_design import * File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\signal\_filter_design.py", line 16, in <module> from scipy import special, optimize, fft as sp_fft File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\__init__.py", line 211, in __getattr__ return _importlib.import_module(f'scipy.{name}') File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\optimize\__init__.py", line 401, in <module> from ._minimize import * File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\optimize\_minimize.py", line 26, in <module> from ._trustregion_constr import _minimize_trustregion_constr File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\optimize\_trustregion_constr\__init__.py", line 4, in <module> from .minimize_trustregion_constr import _minimize_trustregion_constr File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py", line 5, in <module> from .._constraints import ( File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\scipy\optimize\_constraints.py", line 8, in <module> from numpy.testing import suppress_warnings File "C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\testing\__init__.py", line 8, in <module> from unittest import TestCase ImportError: cannot import name 'peak_local_max' from partially initialized module 'skimage.feature' (most likely due to a circular import) (C:\Users\me\AppData\Local\Programs\Python\Python310\lib\site-packages\skimage\feature\__init__.py)
问题原因与解决方法
问题根源
这个循环导入错误并非缺少依赖,而是scipy、numpy与scikit-image版本不兼容导致的模块加载冲突。从报错链能看到,scipy在导入过程中触发了numpy.testing的导入,而这又反过来影响了skimage模块的初始化流程,最终导致peak_local_max无法正常导入。
修复步骤
统一依赖版本
卸载现有冲突版本,安装经过验证的兼容组合:pip uninstall -y scipy numpy scikit-image opencv-python pip install numpy==1.23.5 scipy==1.9.3 scikit-image==0.20.0 opencv-python==4.8.0.76该版本组合在Python 3.10环境下能稳定运行目标代码。
调整导入顺序(可选)
优先导入基础库再导入skimage模块,避免加载时的依赖链混乱:import numpy as np import cv2 from scipy import ndimage from skimage.feature import peak_local_max from skimage.segmentation import watershed验证安装
运行以下代码确认所有模块能正常导入:import cv2 import numpy as np from skimage.feature import peak_local_max from skimage.segmentation import watershed from scipy import ndimage print("所有模块导入成功")
内容的提问来源于stack exchange,提问作者Farm Éva
相关产品推荐
相关产品推荐

