【时间】2018.09.18
【题目】了解skimage库
【参考链接】https://www.jianshu.com/p/f2e88197e81d
【侵权删】
一、概述
skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能。它是由python语言编写的,由scipy 社区开发和维护。skimage包由许多的子模块组成,各个子模块提供不同的功能。主要子模块列表如下:
子模块名称 |
主要实现功能 |
io |
读取、保存和显示图片或视频 |
data |
提供一些测试图片和样本数据 |
color |
颜色空间变换 |
filters |
图像增强、边缘检测、排序滤波器、自动阈值等 |
draw |
操作于numpy数组上的基本图形绘制,包括线条、矩形、圆和文本等 |
transform |
几何变换或其它变换,如旋转、拉伸和拉东变换等 |
morphology |
形态学操作,如开闭运算、骨架提取等 |
exposure |
图片强度调整,如亮度调整、直方图均衡等 |
feature |
特征检测与提取等 |
measure |
图像属性的测量,如相似性或等高线等 |
segmentation |
图像分割 |
restoration |
图像恢复 |
util |
通用函数 |
二、相关细节
具体内容见https://www.jianshu.com/p/f2e88197e81,此部分主要讲解几个最近代码中用到的指令。
1、skimage.io.ImageCollection---图像的批量处理
有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理。这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理。
图片集合函数为:
skimage.io.ImageCollection(load_pattern,load_func=None)
这个函数是放在io模块内的,带两个参数,第一个参数load_pattern, 表示图片组的路径,可以是一个str字符串。第二个参数load_func是一个回调函数,我们对图片进行批量处理就可以通过这个回调函数实现。回调函数默认为imread(),即默认这个函数是批量读取图片。
先看一个例子:
import skimage.io as io
from skimage import data_dir
str=data_dir + '/*.png'
coll = io.ImageCollection(str)
print(len(coll))
显示结果为25, 说明系统自带了25张png的示例图片,这些图片都读取了出来,放在图片集合coll里。如果我们想显示其中一张图片,则可以在后加上一行代码:
io.imshow(coll[10])
显示为:
如果一个文件夹里,我们既存放了一些jpg格式的图片,又存放了一些png格式的图片,现在想把它们全部读取出来,该怎么做呢?
import skimage.io as io
from skimage import data_dir
str='d:/pic/*.jpg:d:/pic/*.png'
coll = io.ImageCollection(str)
print(len(coll))
注意这个地方'd:/pic/.jpg:d:/pic/.png' ,是两个字符串合在一起的,第一个是'd:/pic/.jpg', 第二个是'd:/pic/.png' ,合在一起后,中间用冒号来隔开,这样就可以把d:/pic/文件夹下的jpg和png格式的图片都读取出来。如果还想读取存放在其它地方的图片,也可以一并加进去,只是中间同样用冒号来隔开。
io.ImageCollection()这个函数省略第二个参数,就是批量读取。如果我们不是想批量读取,而是其它批量操作,如批量转换为灰度图,那又该怎么做呢?
那就需要先定义一个函数,然后将这个函数作为第二个参数,如:
from skimage import data_dir,io,color
def convert_gray(f):
rgb=io.imread(f)
return color.rgb2gray(rgb)
str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
io.imshow(coll[10])
这种批量操作对视频处理是极其有用的,因为视频就是一系列的图片组合
from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
print(len(coll)) #连接的图片数量
print(coll[0].shape) #连接前的图片尺寸,所有的都一样
mat=io.concatenate_images(coll)
print(mat.shape) #连接后的数组尺寸
这段代码的意思,就是将myvideo.avi这个视频中每隔10帧的图片读取出来,放在图片集合中。
【PS】回调函数可以是类的一个实例,并且在类中通过__call__函数定义被调用时运行的函数。
-------------------------------------------end-----------------------------------------------------------------