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

本节简要介绍skimage扩展库中各个模块的主要功能,各位可以将其作为一个快速查找手册来使用。用于所示涉及的模块数量较多,个别模块内容丰富,因此分为上、中、下三篇完成。本节为上篇,主要介绍4个基础数据操作模块。本篇文档约6000字。

注:本节主要内容来自scikit-image官网

目录

2.1 skimage各模块总览

2.2 基础数据操作类模块

2.2.1 io模块

2.2.2 color模块

2.2.3 draw模块

2.2.4 data模块

2.1 skimage各模块总览

进入scikit-image官网,最新版本为0.22.0(截止到2024年2月),点击网页最上方的“Document”,然后再点击“API reference”,就能进入到其各个子模块的列表,如下图所示:

skimage各模块内容简介

上图中,一共列出了15个模块(还有两个2个模块功能近似,没有列出),根据功能不同,可将它们模块分为两大类:基础数据操作类算法类

  1. 基础数据操作类模块:包括了skimage.ioskimage.colorskimage.drawskimage.data,一共4个。
  2. 算法类模块:包括了skimage.exposure,skimage.feature,skimage.filter,skimage.graph,skimage.measure,skimage.metrics,skimage.morphology,skimage.restoration,skimage.segmentation,skimage.transform,skimage.util,skimage.resgistration,skimage.future,一共13个。
Skimage各模块按照功能分类

下面按照它们在数字图像处理所属技术领域的不同,介绍各模块的主要功能,方便各位能够快速查找所需的功能函数。为了便于阅读,在介绍时我将每个模块前缀的skimage类名省略,但在实际调用时,除非已经完全加载,否则还是应该输入类名。

官网提供的文档是最好的参考资料,除此之外,还有一些第三方提供了有关Sci-kit image的帮助资源。比如:w3cschool提供了一个Skimage函数查询链接,使用很方便,但没有更新到最新版本的Skimage。

2.2 基础数据操作类模块

基本数据处理模块主要完成针对图像、图形以及图像序列数据的I/O操作,包括:数据的读写格式转换图形绘制等功能,不涉及具体的DIP算法。

2.2.1 io模块

该模块完成的是读取(或写入)不同格式的图像文件,实现了Skimage中绝大多数I/O操作。

给出模块skimage.io的链接,供大家迅速浏览。需要说明的是,使用前首先使用一下语句,将io模块载入(其他的模块也是采用类似的操作,不再重复提示)。

from skimage import io

最新版本的Skimage.io模块共有24个成员函数,以下列出了所有成员函数的名称及简要说明,翻译的不一定很准确,各位可参考官方给出的原文。

  1. skimage.io.call_plugin:找到合适的“kind”插件并执行它。
  2. skimage.io.concatenate_images:将图像集合中的所有图像连接到一个数组中,主要用于由多幅图像构成的序列图像。
  3. skimage.io.find_available_plugins:列出可能的插件。
  4. skimage.io.imread:从文件中加载图像,即图像读取操作。
  5. skimage.io.imread_collection:加载一组图像。
  6. skimage.io.imread_collection_wrapper:
  7. skimage.io.imsave:图像保存操作。
  8. skimage.io.imshow:图像显示操作。
  9. skimage.io.imshow_collection:显示一组图像。
  10. skimage.io.load_sift:从外部文件中读取SIFT或SURF特征。
  11. skimage.io.load_surf:从外部文件中读取SURF特征。
  12. skimage.io.plugin_info:返回插件原数据。    
  13. skimage.io.plugin_order:返回当前首选的插件顺序。 
  14. skimage.io.pop:从共享图像堆栈中弹出图像。
  15. skimage.io.push:将图像推送到共享图像堆栈中。
  16. skimage.io.reset_plugins
  17. skimage.io.show:显示待处理图像。
  18. skimage.io.use_plugin:为指定操作设置默认插件。
  19. skimage.io.ImageCollection:加载和管理图像文件合集。
  20. skimage.io.MultiImage:一个包含所有多帧TIFF图像所有帧的类。
  21. skimage.io.collection :用于保存图像集合的数据结构。
  22. skimage.io.manage_plugins:处理图像读取、写入和绘图插件
  23. skimage.io.sift:
  24. skimage.io.util:

更加详细的使用说明,请参考官网官方文档。另外,本教程后续的“图像基本操作”一节,将再深入介绍部分函数。

2.2.2 color模块

模块名称里面带有color字样,顾名思义,该模块处理对象是彩色信息。更准确的说,该模块处理图像中的颜色信息,比如,不同颜色空间的转换。

首先介绍有关颜色空间(Color Space)一些基本概念。各位可能对颜色空间的含义及用途不甚了解,没关系,只需知道我们平时看到的彩色图像,在计算机进行处理和存储时,通常包含3~4个不同的颜色通道,这些颜色通道组合在一起,才能表达出绚丽多彩的彩色信息。

根据用途和应用领域不同,颜色工程研究人员制定了许多种颜色空间,常用的有RGB、YUV/YCbCr、HSV、Lab/Luv等等。除此之外,还有一种常用的单通道图像,即常见的灰度图像(Gray-level Image)。

不同的应用场合,所获取的或能处理的图像格式不尽相同(既可以压缩格式的不同,也可以是彩色空间的不同),因此就需要将现有格式的转换成指定的格式(比如转换到到指定的颜色空间)。skimage.color模块的主要功能是为了完成图像颜色空间的转换。

虽然该模块skimage.color的功能相对单一,但所含成会函数较多(41个函数),这是因为skimage所支持的颜色空间较多,不同颜色空间对应的转换函数也就较多。各个函数功能相对单一,且使用方式很接近,在此只一个函数为例,简要介绍其实现,其他函数可参考该函数的相关内容。

Skimage使用color.convert_colorspace函数完成不同颜色空间之间的转换,其声明如下

skimage.color.convert_colorspace(arr, fromspace, tospace, channel_axis=-1)

其中,arr代表图像数据,fromspace表示源颜色空间,tospace表示目标颜色空间,channel_axis代表进行处理的颜色通道序号。可以转换的颜色空间包括:‘RGB’, ‘HSV’, ‘RGB CIE’, ‘XYZ’, ‘YUV’, ‘YIQ’, ‘YPbPr’, ‘YCbCr’, ‘YDbDr’。

下面给出一个该函数的使用实例

from skimage import data, color
img = data.astronaut()
img_hsv = color.convert_colorspace(img, 'RGB', 'HSV')

2.2.3 draw模块

 模块skimage.draw包括18个函数,主要完成一些绘制功能,比如在图像上绘制一些常见的图形:直线(line),矩形(rectangle)、圆形(circle)、椭圆(ellipse),碟形(disk)、多边形(polygon)和贝塞尔曲线(Bezier curve)等。另外,还可以在绘制图形时指定一些常用的参数,如线型、粗细、颜色等等。但在实际应用中,可以用其他功能更强大的绘图扩展包来替代该模块(如Matplotlib库等)。因此,我们不再单独详细介绍。

在此给出官网的一个图形绘制实例

import math
import numpy as np
import matplotlib.pyplot as plt

from skimage.draw import (
    line,
    polygon,
    disk,
    circle_perimeter,
    ellipse,
    ellipse_perimeter,
    bezier_curve,
)


fig, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, figsize=(10, 6))
img = np.zeros((500, 500, 3), dtype=np.double)

# draw line
rr, cc = line(120, 123, 20, 400)
img[rr, cc, 0] = 255

# fill polygon
poly = np.array(((300, 300),(480, 320),(380, 430),(220, 590),(300, 300),))

rr, cc = polygon(poly[:, 0], poly[:, 1], img.shape)
img[rr, cc, 1] = 1

# fill circle
rr, cc = disk((200, 200), 100, shape=img.shape)
img[rr, cc, :] = (1, 1, 0)

# fill ellipse
rr, cc = ellipse(300, 300, 100, 200, img.shape)
img[rr, cc, 2] = 1

# circle
rr, cc = circle_perimeter(120, 400, 15)
img[rr, cc, :] = (1, 0, 0)

# Bezier curve
rr, cc = bezier_curve(70, 100, 10, 10, 150, 100, 1)
img[rr, cc, :] = (1, 0, 0)

# ellipses
rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=math.pi / 4.0)
img[rr, cc, :] = (1, 0, 1)
rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=-math.pi / 4.0)
img[rr, cc, :] = (0, 0, 1)
rr, cc = ellipse_perimeter(120, 400, 60, 20, orientation=math.pi / 2.0)
img[rr, cc, :] = (1, 1, 1)

ax1.imshow(img)
ax1.set_title('No anti-aliasing')
ax1.axis('off')

from skimage.draw import line_aa, circle_perimeter_aa

img = np.zeros((100, 100), dtype=np.double)

# anti-aliased line
rr, cc, val = line_aa(12, 12, 20, 50)
img[rr, cc] = val

# anti-aliased circle
rr, cc, val = circle_perimeter_aa(60, 40, 30)
img[rr, cc] = val

ax2.imshow(img, cmap=plt.cm.gray)
ax2.set_title('Anti-aliasing')
ax2.axis('off')

plt.show()

2.2.4 data模块

数据模块skimage.data很特别,不同于其他模块都是完成的特定操作功能,该模块的功能是读取模块中预存的图像集和数据文件,作为测试图像直接载入,用于展示各种算法的处理结果,起到主观评价的作用。

与其他的面向Python的图像处理扩展库的一点不同,skimage库提供了丰富的图像数据,主要分为四类,见下图:

Skimage的Data模块所包含的四类图像数据类型(官网截图)

在此简要介绍一下各类图像库的构成和用途:

  • 一般图像数据库:该库提供了18幅单张图像( 'astronaut', 'binary_blobs', 'brick', 'colorwheel', 'camera',  'cat',    'checkerboard', 'clock', 'coffee', 'coins', 'eagle', 'grass', 'gravel', 'horse', 'logo', 'page', 'text',    'rocket'),主要是彩色/灰度/黑白类型的自然图像,也有部分人工合成图像。该子库图像可用于验证各类通用的图像处理算法。
Skimage提供的一般图像数据集示例(18幅)
  • 科学图像数据库:该子库只含有10幅图像( 'hubble_deep_field', 'immunohistochemistry', 'lily', 'microaneurysms', 'moon', 'retina', 'shepp_logan_phantom', 'skin', 'cell', 'human_mitosis'),图像内容涵盖了多个学科,包括射电、生物、显微成像,等等。
Skimage提供的科学图像数据集示例(10幅)
  • 特定图像库:Skimage库提供了三种特定类型的图像,分别是立体图像(1幅)、平面粒子成像测速图像(1幅)和人脸-非人脸图像库。其中,人脸数据集包含200个样本。
Skimage提供的特殊图像数据集(立体、PIV和人脸)

上述各库的使用细节,将在后续的章节里面展开。

在此讨论一个常见的问题,如何使用这些图像数据呢?其实很简单,因为在安装skimage时,上述图像数据都已经下载到本地磁盘上了,只需要加载data模块,然后栽入所需要的图像数据就行。下面给出一个常见的例程,总结成一句话就是“记住文件名,先加载,后使用”。后面的教程中,将大量使用自带的图像数据。

# 加载数据库
from skimage import data, color
from skimage.io import imshow

# 加载moon图像
img_cat = data.cat()
#imshow(img_cat)

# 处理并显示图像
gray_img = color.rgb2gray(img_cat)
imshow(gray_img)

有关基础数据操作模块的介绍就到此为止,下一节我们将开始介绍Skimage中的核心算法模块。

  • 【1】:《数字图像处理》(第4版)冈萨雷斯等,电子工业出版社,2020年.

(本节初稿完成时间:2024-01-27,修订稿完成时间:2024-07-21)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值