Python skimage 批量图像处理:ImageCollection 与 concatenate_images 详解
本文介绍利用Python skimage库进行批量图像处理的技巧。重点讲解io.ImageCollection函数通过路径模式批量读取图片,支持自定义回调函数实现灰度转换等预处理。结合视频帧提取示例,演示如何将图片集合拼接为高维数组,并展示批量调整尺寸后保存为指定格式的方法,适用于视频处理及大规模图像批处理场景。
正文
在实际应用中,往往需要对大量图片进行统一处理。除了使用循环逐个处理外,还可以利用程序内置的图片集合工具来简化批量操作流程。
图片集合函数
skimage.io.ImageCollection(load_pattern,load_func=None)
该函数位于io模块中,接收两个参数。第一个参数load_pattern用于指定图片路径模式,通常以字符串形式传入;第二个参数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
class AVILoader:
video_file = 'myvideo.avi'
def __call__(self, frame):
return video_read(self.video_file, frame)
avi_load = AVILoader()
frames = range(0, 1000, 10) # 0, 10, 20, ...
ic =io.ImageCollection(frames, load_func=avi_load)上述代码的作用是从myvideo.avi视频中每隔10帧提取一张图片,并将其存入图片集合中。
获取图片集合后,还可以将这些图片连接成一个更高维度的数组,使用的函数为:
skimage.io.concatenate_images(ic)
该函数接收一个参数,即前述的图片集合,使用方式如下:
from skimage import data_dir,io,color
coll = io.ImageCollection('d:/pic/*.jpg')
mat=io.concatenate_images(coll)使用concatenate_images(ic)函数的条件是,参与连接的所有图片尺寸必须一致,否则将报错。观察连接前后的数组维度变化:
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) #连接后的数组尺寸输出结果如下:
2 (870, 580, 3) (2, 870, 580, 3)
可见,两个三维数组被连接成了一个四维数组。
若需将批量处理后的结果保存下来,同样可以实现。
批量保存
示例:将系统自带的所有png示例图片转换为256*256像素的jpg格式灰度图,并保存至d:/data/文件夹。
调整图片尺寸可使用transform模块的resize()函数,该模块后续章节将详细讲解。
from skimage import data_dir,io,transform,color
import numpy as np
def convert_gray(f):
rgb=io.imread(f) #依次读取rgb图片
gray=color.rgb2gray(rgb) #将rgb图片转换成灰度图
dst=transform.resize(gray,(256,256)) #将灰度图片大小转换为256*256
return dst
str=data_dir+'/*.png'
coll = io.ImageCollection(str,load_func=convert_gray)
for i in range(len(coll)):
io.imsave('d:/data/'+np.str(i)+'.jpg',coll[i]) #循环保存图片处理结果:

以上介绍了Python数字图像处理中图像批量处理的核心内容,更多python数字图像批量处理的相关资料请持续关注本站其他文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













