通性概念
skimage 全称为 scikit-image, SciKit 为 toolkit for SciPy,它对 scipy.ndimage 进行了扩展,提供了更多的图片处理功能,由 python 语言编写,由 scipy 社区开发和维护。
1. 模块
skimage 由许多的子模块组成,各个子模块提供不同的功能:
子模块 | 功能 |
---|---|
io | 读取、保存、显示图片或视频 |
data | 提供一些测试图片和样本数据 |
color | 颜色空间变换 |
draw | 操作于 numpy 数组之上的基本图像绘制,包括线条、矩形、圆和文本等 |
transform | 几何变换或其它变换,如旋转、拉伸等 |
exposure | 图片强度调整,如亮度和对比度调整、直方图均衡等 |
filters | 图像增强、边缘检测、排序滤波器、自动阈值等 |
feature | 提取图像特征 |
measure | 图像属性的测量,如相似性或等高线等 |
morphology | 形态学操作,如开闭运算、骨架提取等 |
segmentation | 图像分割 |
restoration | 图像恢复 |
util | 通用函数 |
graph | |
future | |
registration | |
metrics | |
viewer |
2. 数据结构
在 skimage 中,一张图片就是一个简单的 numpy 数组,数组的数据类型有很多种,相互之间也可以转换,其取值范围如下:
一张图片的像素值取值范围是[0, 255],因此默认类型是 uint8。
数据类型 | 数值范围 |
---|---|
uint8 | $[0, 255]$ |
uint16 | $[0, 65535]$ |
uint32 | $[0, 2^{32}-1]$ |
int8 | $[-128, 127]$ |
int16 | $[-32768, 32767]$ |
int32 | $[-2^{31}, 2^{31}-1]$ |
float | $[-1, 1]$ or $[0, 1]$ |
默认的 uint8 可变为 float,float 也可变为 uint8,但后者会有数据的损失,故会有警告提醒:
>>> from skimage import data, img_as_float
>>> img = data.chelsea()
>>> img.shape
(300, 451, 3)
>>> print(img.dtype.name)
uint8
>>> dst = img_as_float(img)
>>> print(dst.dtype.name)
float64
>>> dst.shape
(300, 451, 3)
在 skimage 中,一张图片表示为$height \times width \times channels$的形式,彩色图片访问形式为color_img[row, col, channel]
,灰度图片访问形式为gray_img[row, col]
。
scikit-image 中图片类型及其对应的数组表示形式约定(ch: channel,pln: plane):
Image type | Coordinates |
---|---|
2D grayscale | (row, col) |
2D multichannel (e.g. RGB) | (row, col, ch) |
3D grayscale | (pln, row, col) |
3D multichannel | (pln, row, col, ch) |
之前被这个绕晕了:np.ones((3, 4, 5))
总以为是 $3$ 个$45$的矩阵而不是 $5$ 个$34$的矩阵,其实不就是横看成岭侧成峰嘛,都是对的。只不过当你print(np.ones((3,4,5))
时它在屏幕上是按 print $3$个$4*5$来显示的,其实本质没有区别。
3. IO操作
io 相关操作:
- 读取图片——返回值为 ndarray 类型,这里的 fname 均可为路径形式
skimage.io.imread(fname)
:读取 RGB 图像skimage.io.imread(fname, as_grey=True)
:读取灰度图像
- 显示图片:将某数组显示为图像
skimage.io.imshow(arr)
:io.imshow(img)
其实是plt.imhsow(img, cmap=None)
的封装;skimage.io.show()
:io.show()
也等价于plt.show()
,其实我们更喜欢用plt.imshow(img)
来显示图像。
- 保存图片:
skimage.io.imsave(fname, arr)
:在保存时可自由选择后缀以更改其格式
plt相关API
在用 pyplot 来绘制图像时,常用的操作有:
图像操作 | 作用 | 示例 |
---|---|---|
plt.figure() | 创建一个显示窗口 | plt.figure(num=1, figsize=(8,8) |
plt.imshow() | 绘制图像 | plt.imshow(image) |
plt.show() | 显示窗口 | plt.show() |
plt.subplot() | 划分子图 | plt.subplot(2,2,1) |
plt.title() | 设置子图标题(与 plt.subplot()搭配使用) | plt.title('origin image') |
plt.axis() | 是否显示坐标尺 | plt.axis('off') |
plt.subplots() | 创建带有多个子图的窗口 | fig, axes = plt.subplots(2,2,figsize=(8,8)) |
plt.ravel() | 为每个子图设置变量 | ax0,ax1,ax2,ax3 = axes.ravel() |
plt.set_title() | 设置子图标题(与 axes 结合使用) | ax0.set_title('first window') |
plt.tight_layout() | 自动调整子图显示布局 | plt.tight_layout() |
4. data
skimage 自带了一些示例图片,可以从 data 中直接使用这些示例,使用方法是像函数那样调用,如 img = skimage.data.astronaut()
:
图片 data | 说明 |
---|---|
astronaut | 航天员图片 |
camera | 拿相机的人图片 |
checkerboard | 棋盘图片 |
chelsea | 小猫图片 |
clock | 时钟图片 |
coffee | 一杯咖啡图片 |
coins | 硬币图片 |
horse | 马图片 |
hubble_deep_field | 星空图片 |
immunohistochemistry | 结肠图片 |
moon | 月亮图片 |
page | 书页图片 |
text | 文字图片 |
由于图片在数据结构上表示为 ndarray 形式,故可使用 numpy 的 ndarray 的任何相关操作,如
代码 | 说明 |
---|---|
from skimage import io, data img = data.chelsea() io.imshow(img) | #载入图片 |
print(type(img)) | #显示类型 |
print(img.shape) | #显示尺寸 |
print(img.shape[0]) | #图片高度 |
print(img.shape[1]) | #图片宽度 |
print(img.shape[2]) | #图片通道数 |
print(img.size) | #显示总像素个数 |
print(img.max()) | #最大像素值 |
print(img.min()) | #最小像素值 |
print(img.mean()) | #像素平均值 |
print(img[0][0]) | #图像的像素值 |
5. color
常用的颜色空间有灰度空间、rgb空间、hsv空间和cmyk空间,颜色空间转换后,图片类型都变成了float型,所有的颜色空间转换函数都放在skimage的color
模块。
颜色空间转换的函数模式都是一样的:
from skimage import data, color
img=data.lena()
gray=color.rgb2gray(img)
io.imshow(gray)
所有转换型式
skimage.color.rgb2grey(rgb)
skimage.color.rgb2hsv(rgb)
skimage.color.rgb2lab(rgb)
skimage.color.gray2rgb(image)
skimage.color.hsv2rgb(hsv)
skimage.color.lab2rgb(lab)
以上都可用此函数代替,表示arr从fromspace颜色空间转换到tospace颜色空间:
skimage.color.convert_colorspace(arr, fromspace, tospace)
from skimage import io,data,color img=data.lena() hsv=color.convert_colorspace(img,'RGB','HSV') io.imshow(hsv)
label2rgb
函数
在color模块的颜色空间转换函数中,还有一个比较有用的函数是skimage.color.label2rgb(arr)
,它可以根据标签值对图片进行着色:
from skimage import io,data,color
import numpy as np
img=data.chelsea()
gray=color.rgb2gray(img)
rows,cols=gray.shape
labels=np.zeros([rows,cols])
for i in range(rows):
for j in range(cols):
if(gray[i,j]<0.4):
labels[i,j]=0
elif(gray[i,j]<0.75):
labels[i,j]=1
else:
labels[i,j]=2
dst=color.label2rgb(labels)
io.imshow(dst)
![]() | ![]() |
---|