用skimage学习数字图像处理(003):Skimage各模块初探(中)

本节将简要介绍skimage扩展库,重点介绍各个模块的功能,大家可以将其作为一个手册来查询。这是中篇,主要介绍几个算法类的子库,包括:metrics(评价指标)、transform(几何变换)、exposure(点变换)、filter(滤波)、restoration(复原)、morphology(形态学)等模块,这些内容对应图像处理领域中的底层技术。本篇文档约8000字。

目录

2.3 算法类模块

2.3.1 metrics模块

2.3.2 util模块

2.3.3 transform模块

2.3.4 exposure模块

2.3.5 filters模块

2.3.6 restoration模块

2.3.7 morphology模块

2.3 算法类模块

这类模块是scikit-image的主要组成部分,功能丰富,基本上涵盖了主流的经典DIP算法。

不是很准确的统计,Skimage大约提供有独立函数名的算法超过500+。Skimage更专注于基础的DIP领域,所实现的DIP算法较OpenCV更全面,但在OpenCV擅长的视频处理和3D视觉领域的函数较少。

由于后面的教程基本上都是围绕着各个模块展开的。在此只简要说明各个模块的主要功能,并列举其中最有代表性的若干算法。

2.3.1 metrics模块

在图像处理领域,为了比较同类算法的性能差异,常使用一些性能指标(Matrics)用于衡量处理结果的优劣程度。Skimage库使用metrics模块计算出各种常见的指标值,通过调用这些函数,可以方便地计算各种指标值。

最新版0.24版的metric模块实现了10种量化指标的计算,它们在图像处理领域的各个方面都有广泛的应用。每一种指标的准确定义,及所适用的领域,将在后续的章节中逐一介绍。其中,表中前4个指标值在DIP领域应用十分广泛。

Skimage.metrics模块函数说明
序号函数名功能说明
1mean_squared_error计算两幅图像的均方误差(MSE)
2normalized_root_mse计算两幅图像的归一化均方根误差(NRMSE)
3peak_signal_noise_ratio计算一幅图像的峰值信噪比(PSNR)
4structural_similarity计算两幅图像的结构相似性 (SSIM)
5hausdorff_distance计算图像内非零点之间的Hausdorff距离
6hausdorff_pair返回用于计算Hausdorff距离的图像点对,与上面的5配套使用
7normalized_mutual_information计算归一化互信息(NMI)。
8adapted_rand_error计算 SNEMI3D 竞赛定义的自适应Rand误差
9contingency_table计算列联表
10variation_of_information计算对称条件熵

2.3.2 util模块

Skimage库中的utility模块提供一些通用处理函数。这些处理方法在图像处理各个领域都可能用到,如图像数据类型的转换等。

与其他模块相比,该模块里面的函数功能关系不密切,最新版本0.24版中该模块含有23个函数,根据功能的相似性,可大致分为以下四类:

  1. 图像数据类型转换类:常用与图像数据表示的数据类型有:整型(又细分为8位和16位,以及有符号和无符号)、实型(又细分为16位、32位和64位),以及布尔型(即二值),在此模块对应着7个函数:img_as_uintimg_as_ubyteimg_as_intimg_as_floatimg_as_float32img_as_float64img_as_bool
  2. 图像数据操作类:这一类函数是将图像视为一个高维数组数据,然后进行相应的数据操作,总共9个。包括:将图像中的每个维度裁剪指定宽度的数组(crop)、删除图像中数据重复的行(unique_rows)、沿着轴方向切分图像(slice_along_axes)、在数组中并行映射函数(apply_parallel)、返回图像数据类型的最大值和最小值(dtype_limits)、根据标签图像进行数据映射(map_array)、沿着指定间隔搜索点(regular_grid)、返回具有规则间隔的非零像素的图像(egular_seeds)、对scikit图像文档字符串进行关键字搜索并打印结果(lookfor)。
  3. 图像的特效显示类:为单通道或多通道图像创建蒙太奇(montage)、构建图像的块非重叠视图(view_as_blocks)、构建图像的滚动窗口视图(view_as_windows),总共3个。
  4. 简单图像操作类:图像反色处理(invert),计算两幅图像的差值图(compare_images),在图像上添加随机噪声(random_noise)、根据模板给图像各像素点指定标签(label_points),总共4个。

上面只是将各个函数的名称进行了翻译,没有给出详细的使用说明和实例。各位可点击上面给出的链接,去官网查看详细的官方文档。后面章节中用到时,会单独介绍各函数的功能。

2.3.3 transform模块

Skimage库中的transform模块主要完成一些与图像变换相关的操作,包括了38个函数(0.24版)。

谈到变换,做信息处理的人一般会想到两层含义。一层是在同一个特征空间中的变换,比如图像的几何变换等;另一层含义是在不同特征空间之间的变换,即从一个特征空间转换到另一个特征空间,如大家熟悉的傅里叶变换、小波变换等。transform模块模块主要完成的第一层含义的变换,即在图像的空间变换。

先看一下官网上对该模块功能的介绍,以下内容是将官网文档直接翻译的结果:

  1. 几何变换: 完成针对像素点的空间位置变换,包括仿射变换、透视变换等,常用于图像对齐、配准和几何矫正等用途。典型实例:AffineTransform, ProjectiveTransform, EuclideanTransform.
  2. 调整图像尺寸大小:通过这类变换,可以改变图像的尺寸或分辨率,常用于图像的上采样和下采样处理等用途。典型实例:resize, rescale.
  3. 特征检测与提取:这类变换完成从图像中提取特定的特征或模式(比如获取直线),常用于对象检测、图像分割和特征匹配等用途。典型实例:hough_circle, pyramid_expand, radon.
  4. 图像变形:这类变换完成在不改变图像内容的前提下,变换图像的呈现方式,常用于针对图像的马赛克处理、图像的风格转化、数据可视化等。典型实例:warp, iradon.

由于该模块函数较多,受限于版面,在此不在用列表方式给逐一列出。大部分函数将在后续的“图像空间变换”一节中详细介绍。

2.3.4 exposure模块

Skimage库中的skimage.exposure模块的名称有一定歧义。在DIP领域,Exposure通常被译为“曝光”,也可以理解为在成像过程中调整采集设备(比如光学镜头)的光圈大小,进而实现调整曝光度的目的。当然还有另外一种方式,即调整曝光时间的长短。总之,在保证光照条件的前提下,光圈越大,曝光时间越长,得到的图像越明亮;反之亦然。

这一模块中各个算法完成的确实有些类似通过后处理算法,近似实现调整图像曝光度的功能。本模块所涉及的算法,通常可归属到图像空域增强领域中的灰度值变换的内容。

在最新的0.24版本中,该模块只有10个函数,虽然数目不多,但每一个函数都很有用。下面的表格列出了所有10个函数的声明,大家主要关注函数功能介绍一栏。

skimage-exposure模块函数说明
序号函数名功能说明
1adjust_gammaGamma校正,另外一个名字叫幂次变换
2adjust_log对数校正,功能与Gamma校正类似
3adjust_sigmoidSigmoid校正,可以看作是一种归一化方法
4is_low_contrast判断图像是否是低对比度图像
5rescale_intensity对图像的灰度级进行拉伸或放缩处理
6histogram计算图像的直方图,可以是灰度图和彩色图像
7cumulative_distribution计算图像灰度值的累积分布(cdf),其实就是累积直方图
8equalize_hist完成经典的直方图均衡化算法
9equalize_adapthist

大名鼎鼎的CLAHE算法,一种自适应直方图均衡方法

10match_histograms完成直方图匹配算法,通过直方图均衡来实现

(注:为了简化版面,省略了各个函数名之前类名skimage.exposure,使用时应酌情考虑补齐)

相信学过DIP的读者,对上述函数所实现的功能都很熟悉,至于各个函数的详细使用说明以及使用实例,将在后面的章节里详细加以介绍。

2.3.5 filters模块

Skimage库中的filters模块和filters.rank模块完成的是图像的滤波操作,滤波(filtering)是信息处理领域的专业术语,以图像处理领域的滤波操作为例,可以认为它就是一个加工车间,输入的是一幅图像,输出的是另外一幅图像(一般尺寸不变,但通道数、数据类型、特征空间有可能发生改变),从输入到输出的变化,如果能用数学工具进行建模,并用$T$来表示这个变换的话,这个$T$本身就相当于一个滤波器,这个变换过程就可以理解为滤波处理。不知道这么解释大家是更明白了,还是更糊涂了。如果还想深入了解,建议各位补充《信号与系统》、《数字信号处理》等方面的知识。

回到主题,该模块实现了DIP领域几乎所有的经典滤波算法,不管是线性还是非线性,空域还是变换域。单凭这一点,就不是其他Python图像处理库(如OpenCV)所能比拟的。这两个模块的函数很多,以0.24版本为例,共有78个函数。

先看一下filters模块。根据其功能或工作原理,将其分为几个大类,供大家参考。按照作用特征空间不同,该模块的函数主要分为空域滤波类频域滤波类。但显然这样的划分方法太笼统了。因此我们将其中占多数的空域滤波方法,进一步按照功能和原理,细分为空域线性平滑类空域线性锐化类空域非线性平滑空域阈值化类,等等。其中线性/非线性指的它数学形式是否满足线性,平滑/锐化指的是该滤波器的功能。

  1. 空域线性平滑类:多维高斯滤波器(gaussian)。
  2. 空域线性锐化类:使用Laplace计算边缘图(laplace)、反锐化遮蔽滤波器(unsharp_mask)使用Roberts算子计算边缘图(3个,roberts, roberts_neg_diag, roberts_pos_diag)、使用Prewitt算子计算边缘图(3个,prewitt, prewitt_h, prewitt_v)、使用Scharr算子计算边缘图(3个,scharr, scharr_h, scharr_v)、使用Sobel算子计算边缘图(3个,sobel, sobel_h, sobel_v)、计算farid变换计算边缘图(3个,farid farid_hfarid_v)、差分高斯滤波器(difference_of_gaussians)。
  3. 空域阈值化类:使用Otsu法计算阈值(threshold_otsu)、使用三角算法计算阈值(threshold_triangle)、使用最小值方法计算阈值(threshold_minimum)、使用均值作为阈值(threshold_mean)、使用ISODATA方法计算阈值(threshold_isodata)、使用Li的迭代最小交叉熵方法计算阈值(threshold_li)、使用Yen的方法计算阈值(threshold_yen)、使用ISODATA方法计算阈值(threshold_isodata)、使用Li的迭代最小交叉熵方法计算阈值(threshold_li)、计算局部阈值(threshold_local)、使用Sauvola局部阈值方法计(threshold_sauvola)、使用Niblack局部阈值方法计(threshold_niblack),等等。
  4. 空域统计排序类:中值滤波(median)、返回升序排序序号(rank_order)。
  5. 频域类:最小军方误差逆滤波(即Wiener滤波,wiener)、巴特沃斯滤波器(butterworth)。

由于该模块函数众多,可能有所遗漏,大家还是以官方文档作为最终参考。

除上述滤波器之外,0.24版还专门提供了一个新的滤波器模块filters.rank,里面共有31个函数,各个函数的功能较杂乱。仍然是按照功能进行分类:

  1. 空域平滑滤波类:计算几何均值类(geometric_mean)、计算较大数值(majority)、计算局部最大值(maximum)、计算几何均值类(geometric_mean)、计算局部均值(mean)、基于双边滤波的计算局部均值(mean_bilateral)、基于百分比的计算局部均值(mean_percentile)、计算局部中值(median)、计算局部最小值(minimum)、计算局部百分比值(percentile)、计算局部最小值(minimum)。
  2. 空域锐化滤波类图像对比度增强(enhance_contrast和enhance_contrast_percentile)、使用Roberts算子计算边缘图()。
  3. 邻域处理类:计算局部熵(Local entropy和entropy)、计算局部梯度类(gradient和gradient_percentile)、,等等。
  4. 二值化处理类基于otsu方法的二值化(otsu )、获取图像的局部阈值(threshold和threshold_percentile)。
  5. 直方图类:基于局部直方图的直方图均衡(equalize)、计算滑动窗的归一化直方图(windowed_histogram)。
  6. skimage.filters.rank.autolevel    Auto-level image using local histogram.
    skimage.filters.rank.autolevel_percentile    Return grayscale local autolevel of an image.
  7. skimage.filters.rank.modal        Return local mode of an image.
    skimage.filters.rank.noise_filter    Noise feature.
  8. skimage.filters.rank.pop        Return the local number (population) of pixels.
  9. skimage.filters.rank.pop_bilateral    Return the local number (population) of pixels.
    skimage.filters.rank.pop_percentile    Return the local number (population) of pixels.
    skimage.filters.rank.subtract_mean    Return image subtracted from its local mean.
    skimage.filters.rank.subtract_mean_percentile    Return image subtracted from its local mean.
    skimage.filters.rank.sum        Return the local sum of pixels.
    skimage.filters.rank.sum_bilateral    Apply a flat kernel bilateral filter.
    skimage.filters.rank.sum_percentile    Return the local sum of pixels.

     

2.3.6 restoration模块

Skimage库中的restoration模块面向图像处理中的复原领域,它内部集成了几种经典的图像复原方法,涉及到去噪、去模糊等典型的图像复原研究领域。图像复原一直是图像处理及计算机视觉的难点问题。有关图像复原的原理、模型以及方法分类,将在后续章节中详细介绍。

相对于其他模块,该模块规模较小,只有17个函数,在此将所有函数的信息列出,供各位查阅浏览。

序号函数名称功能说明
1denoise_bilateral使用双边滤波器去噪
2denoise_nl_means使用非局部均值方法(NL-means)去噪
3denoise_wavelet使用小波变换方法去在
4denoise_tv_bregman使用拆分布雷格曼总变分方法去噪
5denoise_tv_chambolle使用Chambolle提出的一种总变分方法去噪
6calibrate_denoiser校正去噪函数,并返回最优J不变版本,与7配合使用
7denoise_invariant使用一种去噪函数的J不变版本,与6配合使用
8rolling_ball通过翻转/平移核来估计背景灰度值
9ellipsoid_kernel为rolling_ball方法创建一个椭圆形核,配合8使用
10ball_kernel为rolling_ball方法创建一个圆形核,配合8使用
11wiener经典的Wiener-Hunt反卷积算法
12unsupervised_wiener无监督Wiener-Hunt反卷积算法
13richardson_lucy大名鼎鼎的Richardson-Lucy(RL)反卷积算法
14unwrap_phase从环绕相位图像中恢复原始图像
15inpaint_biharmonic用双调和方程对图像中的掩模点进行修复
16estimate_sigma基于小波鲁棒估计高斯噪声标准差
17cycle_spin循环平移

由上表可见,Skimage提供的复原函数,主要集中在去噪反卷积两个传统的复原研究领域,相关方法我们将在后续章节中逐一介绍。

另外,0.24版本中还包括一个registration库,该模块主要完成图像/视频数据的“配准”任务。该模块只有三个函数,分别是两种光流场估计算法(optical_flow_ilkoptical_flow_tvl1),以及一种基于互相关的亚像素图像平移配准方法(phase_cross_correlation)。

2.3.7 morphology模块

Skimage库中的morphology模块提供了对图像处理“数学形态学”基本操作和应用的支持,主要针对二值图像的形状分析,部分函数也可直接用于灰度图像。

该模块是Skimage库中一个特色模块,相对于其他常见的Python图像处理库(在此又要提到OpenCV作对比),该模块提供的函数更多,功能更全。可以说是实现基于Python的图像形态学处理首选库,没有之一。

该模块一共提供了49个函数(0.24版)。根据功能不同,大致可分为结构元构建基本操作形态学处理三类:

  1. 结构元构建类:一共有11种,包括:矩形(rectangle)、正方形(square)、碟形/圆形(disk)、菱形(diamond)、椭圆形(ellipse)、八边形(octagon)、星形(star)、立方体(cube)、球体(ball)、八面体(octahedron),自定义结构元(footprint_from_sequence)。其中,前7种是2D结构元,后3种为3D结构元。
  2. 基本形态学操作类:根据处理的是图像类型不同,进一步细分为三组:
  • 二值形态学操作:普通的腐蚀、膨胀、开、闭运算(binary_erosionbinary_dilationbinary_openingbinary_closing)、各向同性的腐蚀、膨胀、开、闭运算(isotropic_erosionisotropic_dilationisotropic_openingisotropic_closing)。
  • 灰度形态学操作:灰度图像的腐蚀、膨胀、开、闭运算(erosiondilationopeningclosing)。
  • 二值/灰度图像学操作:直径开/闭运算(diameter_closingdiameter_opening),以及面积开/闭运算(area_openingarea_closing)。

   3. 形态学处理针对二值图像的细化(thin)、骨架化和3D骨架化(skeletonize/skeletonize3d)、凸集化处理(convex_hull_image/convex_hull_object),以及中轴变换(medial_axis),黑帽/白帽变换(black_tophatwhite_tophat)、形态学重建(reconstruction)、去除空洞/小面积区域/特定距离区域(remove_small_holesremove_small_objectsremove_small_objects_by_distance)、洪水填充(floodflood_fill)、计算局部最小值/最大值(local_minima/local_maxima)、计算图像(局部)最大树(max_tree/max_tree_local_maxima),标注连通区域(label ),根据特定条件确定对象的最大值(h_maxima /h_minima),在每一维度上的操作(mirror_footprint /pad_footprint)。

不难看出,Skimage提供的形态学处理功能丰富(实际上是功能最多的,比Matlab还多)。有关数学形态学的各种操作和处理的原理和实现过程,将在后续章节中结合实例讲解。

(本节初稿完成日期:2024-01-29,本节修订完成时间:2024-07-23)

(未完待续,欢迎对DIP+python算法开发感兴趣的初学者,尤其是相关专业本科和低年级研究生关注,本专栏完将持续更新,敬请关注)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值