本文共 2139 字,大约阅读时间需要 7 分钟。
图像基础
黑白图像通常用二维矩阵表示,而灰度图像则使用0-1之间的数值表示。对于彩色图像,常用的表示方法是RGB或BGR三通道,数值范围在0-255之间。无论是RGB还是BGR,图像的维度都是高度×宽度×通道数(H×W×C)。在深度学习中,由于需要对各通道分别进行卷积运算,因此通道维度通常排在前面,表达为C×H×W。通过numpy的transpose函数可以轻松将图像转换为适合深度学习的格式。
在Python中,常用的数字图像处理库包括PIL/Pillow、OpenCV和scikit-image。PIL和Pillow功能相对基础,适合简单的图像处理需求;而OpenCV是一个功能强大的C++库,仅为Python提供了接口。相比之下,scikit-image基于scipy开发,专门将图像处理功能转化为numpy数组操作,使用起来更加简便。
scikit-image功能模块
scikit-image是一个功能丰富的图像处理库,其主要模块包括: - **io模块**:用于读取和写取图像。 - **data模块**:提供了一些示例图像,方便开发和测试。 - **transform模块**:包含图像变形功能,如缩放、旋转等。 - **exposure模块**:处理亮度和对比度问题。 - **filters模块**:提供多种滤波器,支持高通、低通滤波、边缘检测等操作。 - **morphology模块**:实现形态学操作,如膨胀、腐蚀等。 - **rank模块**:高级滤波和图像增强功能。 - **measure模块**:用于图像测量和分析。
2.1 io模块:读写功能
- **imread**:读取图像文件,返回3维numpy数组。灰度图像可设为as_grey=True,得到2维数组。 - **imshow**:将numpy数组显示为RGB格式的图像。 - **imsave**:保存图像文件。 - **ImageCollection**:批量读取并处理多张图片。 - **concatenate_images**:将多张图像数组合成一个更高维的数组。
2.2 data模块:示例图片
scikit-image内置了一些示例图片,开发者可以直接使用这些数据集进行测试和开发。例如,data.coffee()返回一张咖啡杯的图片数组。
2.3 transform模块:图像变形
- **resize**:调整图像大小。 - **rescale**:缩放图像。 - **pyramid_gaussian**:高斯金字塔变换。 - **rotate**:旋转图像。
2.4 exposure模块:亮度和对比度
- **adjust_gamma**:调整对比度。 - **adjust_log**:对数调整。 - **rescale_intensity**:调整亮度范围。 - **histogram**:直方图分析。 - **equalize_hist**:直方图均衡化。
2.5 filters模块:滤波器
- **高通滤波器**:用于边缘检测。 - **低通滤波器**:平滑图像,去噪。 - **边缘检测**:支持Sobel、Roberts、Scharr、Prewitt和Gabor滤波器。Canny算子在feature中特别有效。 - **平滑滤波**:GaussianFilter支持不同模糊效果。 - **阈值分割**:OTSU、Yen、LI和自适应阈值分割。
2.6 morphology模块:形态学操作
- **dilation**:图像膨胀。 - **erosion**:图像腐蚀。 - **opening**:先腐蚀再膨胀,用于去除小孔洞。 - **closing**:填充孔洞。 - **white-tophat**:保留图像中的小斑点。 - **black-tophat**:保留图像中的孔洞。 - **convex_hull_image**:计算图像凸包。
2.7 rank模块:高级滤波
- **autolevel**:自动对比度。 - **bottomhat**:下凸滤波。 - **tophat**:上凸滤波。 - **enhance_contrast**:增强对比度。 - **entropy**:熵值分析。 - **equalize**:均衡化。 - **gradient**:梯度计算。
2.8 measure模块:图像测量
- **label**:图像分割。 - **regionprops**:分析连通区域。 - **remove_small_objects**:去除小物体。
常用组合
边缘检测通常需要先进行模糊处理。例如: - **blur**:简单的算术平均模糊。 - **medianBlur**:适合数字化视频去噪。 - **GaussianBlur**:高斯滤波去噪后再进行边缘检测。 - **Laplacian**:双导数滤波器,产生明显的边缘线条。 - **Sobel**和**Scharr**滤波器:计算水平和垂直方向的梯度。 - **Canny算子**:结合高斯滤波、非最大抑制和双阈值去噪,得到更准确的边缘。
转载地址:http://umiwz.baihongyu.com/