Python skimage 批量图像处理:ImageCollection 与 concatenate_images 详解

Ivy
Ivy
发布时间:2026-10-16 | 4人浏览过
原创

本文介绍利用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数字图像批量处理的相关资料请持续关注本站其他文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表