scikit-image (skimage) 完整API参考文档
scikit-image (skimage) 完整API参考文档
包含:
IO操作 - 图像读取、保存、显示
滤波处理 - 边缘检测、平滑、阈值分割
形态学 - 腐蚀、膨胀、开闭运算、分水岭
图像分割 - SLIC、Chan-Vese、随机游走等
特征检测 - 角点、斑点、HOG、LBP等
几何变换 - 旋转、缩放、仿射、透视、Hough变换
测量分析 - 区域属性、轮廓检测、形状分析
图像恢复 - 各种去噪算法、去模糊
曝光调整 - 直方图操作、强度调整
颜色空间 - RGB/HSV/LAB等转换
绘图工具 - 几何形状绘制
实用工具 - 数据类型转换、噪声添加
目录
- 简介
- 安装和导入
- 核心子模块详解
- skimage.io - 图像输入输出
- skimage.filters - 图像滤波
- skimage.morphology - 形态学操作
- skimage.segmentation - 图像分割
- skimage.feature - 特征检测
- skimage.transform - 图像变换
- skimage.measure - 测量和分析
- skimage.restoration - 图像恢复
- skimage.exposure - 曝光调整
- skimage.color - 颜色空间转换
- skimage.draw - 绘图功能
- skimage.util - 实用工具
- 实际应用案例
- 最佳实践
简介
scikit-image是一个基于SciPy构建的开源图像处理库,专门为Python设计。它提供了广泛的图像处理算法,包括分割、几何变换、颜色空间操作、分析、滤波、形态学、特征检测等功能。
核心特点
- 🔬 科学计算导向:基于NumPy数组,与科学计算生态系统完美集成
- 🎯 算法丰富:涵盖图像处理的各个方面,从基础到高级
- 📚 易于学习:API设计简洁直观,文档完善
- 🔧 模块化设计:功能按模块组织,便于使用和维护
- 🚀 高性能:底层使用Cython优化,支持多维数组操作
安装和导入
安装
# 使用pip安装
pip install scikit-image# 使用conda安装
conda install scikit-image# 安装所有依赖
pip install scikit-image[optional]
基本导入
import skimage
from skimage import io, filters, morphology, segmentation
from skimage import feature, transform, measure, restoration
from skimage import exposure, color, draw, util
import numpy as np
import matplotlib.pyplot as plt
核心子模块详解
skimage.io - 图像输入输出
图像读取、保存和显示功能。
主要函数
imread(fname, as_gray=False, plugin=None, **plugin_args)
读取图像文件。
参数:
fname
(str): 文件路径as_gray
(bool): 是否转换为灰度图像plugin
(str): 指定读取插件
from skimage import io# 读取彩色图像
image = io.imread('image.jpg')# 读取为灰度图像
gray_image = io.imread('image.jpg', as_gray=True)# 读取多帧图像(如TIFF堆栈)
image_stack = io.imread('stack.tif', plugin='tifffile')
imsave(fname, arr, plugin=None, check_contrast=True, **plugin_args)
保存图像到文件。
参数:
fname
(str): 输出文件路径arr
(ndarray): 图像数组check_contrast
(bool): 是否检查对比度
# 保存图像
io.imsave('output.png', processed_image)# 保存时指定质量(JPEG)
io.imsave('output.jpg', image, quality=95)
imshow(arr, plugin=None, **plugin_args)
显示图像。
# 显示图像
io.imshow(image)
io.show()# 使用matplotlib显示
import matplotlib.pyplot as plt
plt.imshow(image)
plt.axis('off')
plt.show()
其他有用函数
# 获取可用插件
print(io.available_plugins)# 读取图像集合
image_collection = io.ImageCollection('*.jpg')
for img in image_collection:print(img.shape)
skimage.filters - 图像滤波
各种图像滤波和边缘检测算法。
边缘检测
sobel(image, mask=None, axis=None)
Sobel边缘检测。
from skimage import filters# Sobel边缘检测
edges = filters.sobel(gray_image)# 指定方向
edges_x = filters.sobel(gray_image, axis=1) # 水平边缘
edges_y = filters.sobel(gray_image, axis=0) # 垂直边缘
canny(image, sigma=1.0, low_threshold=None, high_threshold=None)
Canny边缘检测。
# Canny边缘检测
edges = filters.canny(gray_image, sigma=2, low_threshold=0.1, high_threshold=0.2)
prewitt(image, mask=None)
Prewitt边缘检测。
edges = filters.prewitt(gray_image)
平滑滤波
gaussian(image, sigma=1, output=None, mode='nearest')
高斯滤波。
# 高斯平滑
blurred = filters.gaussian(image, sigma=2)# 多通道图像
blurred_color = filters.gaussian(color_image, sigma=1, multichannel=True)
median(image, disk(radius), out=None, mode='nearest')
中值滤波。
from skimage.morphology import disk# 中值滤波去噪
denoised = filters.median(image, disk(2))
其他滤波器
# 双边滤波
bilateral = filters.bilateral(image, sigma_color=0.1, sigma_spatial=15)# 拉普拉斯滤波
laplacian = filters.laplace(gray_image)# Frangi滤波(血管增强)
frangi = filters.frangi(gray_image, sigmas=range(1, 10, 2))# Hessian滤波
hessian = filters.hessian(gray_image, sigmas=[1, 2, 3])
阈值分割
threshold_otsu(image, nbins=256)
Otsu自动阈值选择。
# Otsu阈值
thresh = filters.threshold_otsu(gray_image)
binary = gray_image > thresh
其他阈值方法
# 局部阈值
local_thresh = filters.threshold_local(gray_image, block_size=35)
binary_local = gray_image > local_thresh# 李氏阈值
li_thresh = filters.threshold_li(gray_image)# 三角阈值
triangle_thresh = filters.threshold_triangle(gray_image)# Yen阈值
yen_thresh = filters.threshold_yen(gray_image)
skimage.morphology - 形态学操作
数学形态学操作,用于图像的结构分析和处理。
结构元素
from skimage import morphology# 创建结构元素
disk_elem = morphology.disk(3) # 圆盘
square_elem = morphology.square(3) # 正方形
rectangle_elem = morphology.rectangle(3, 5) # 矩形
star_elem = morphology.star(3) # 星形
基本形态学操作
erosion(image, selem=None, out=None)
腐蚀操作。
# 腐蚀
eroded = morphology.erosion(binary_image, morphology.disk(2))
dilation(image, selem=None, out=None)
膨胀操作。
# 膨胀
dilated = morphology.dilation(binary_image, morphology.disk(2))
opening(image, selem=None, out=None)
开运算(先腐蚀后膨胀)。
# 开运算 - 去除小物体
opened = morphology.opening(binary_image, morphology.disk(3))
closing(image, selem=None, out=None)
闭运算(先膨胀后腐蚀)。
# 闭运算 - 填充小孔
closed = morphology.closing(binary_image, morphology.disk(3))
高级形态学操作
# 形态学梯度
gradient = morphology.gradient(binary_image, morphology.disk(2))# 顶帽变换(原图与开运算的差)
tophat = morphology.white_tophat(gray_image, morphology.disk(5))# 黑帽变换(闭运算与原图的差)
blackhat = morphology.black_tophat(gray_image, morphology.disk(5))# 骨架化
skeleton = morphology.skeletonize(binary_image)# 凸包
convex_hull = morphology.convex_hull_image(binary_image)# 去除小物体
cleaned = morphology.remove_small_objects(binary_image, min_size=100)# 去除小孔洞
filled = morphology.remove_small_holes(binary_image, area_threshold=50)
分水岭算法
from scipy import ndimage
from skimage.feature import peak_local_maxima# 距离变换
distance = ndimage.distance_transform_edt(binary_image)# 寻找局部最大值作为种子点
local_maxima = peak_local_maxima(distance, min_distance=20, threshold_abs=0.3)# 创建标记
markers = np.zeros_like(distance, dtype=int)
markers[tuple(local_maxima.T)] = np.arange(1, len(local_maxima) + 1)# 分水岭分割
labels = morphology.watershed(-distance, markers, mask=binary_image)
skimage.segmentation - 图像分割
图像分割算法集合。
区域生长分割
flood_fill(image, seed_point, new_value, ...)
漫水填充算法。
from skimage import segmentation# 漫水填充
filled = segmentation.flood_fill(image, (100, 100), 255, tolerance=0.1)
基于聚类的分割
slic(image, n_segments=100, compactness=10, ...)
SLIC超像素分割。
# SLIC超像素
segments = segmentation.slic(image, n_segments=300, compactness=10, sigma=1)# 显示超像素边界
boundaries = segmentation.mark_boundaries(image, segments)