有些时候,不仅要对一张图片进行处理,可能还会对一批图片进行处理。 这时候,可以通过循环来执行处理,也可以调用程序自带的图片集合来处理。
图片集合函数为:
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))
23
显示结果为 30
, 说明系统自带了 30
张 PNG
的示例图片,
这些图片都读取了出来,放在图片集合 coll
里。
如果我们想显示其中一张图片,则可以使用索引:
io.imshow(coll[10])
/opt/conda/lib/python3.12/site-packages/skimage/io/collection.py:316: FutureWarning: The plugin infrastructure in `skimage.io` is deprecated since version 0.25 and will be removed in 0.27 (or later). To avoid this warning, please do not pass additional keyword arguments for plugins (`**plugin_args`). Instead, use `imageio` or other I/O packages directly. See also `skimage.io.imread`. self.data[idx] = self.load_func(fname, **kwargs) /tmp/ipykernel_77/2399103266.py:1: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(coll[10])
<matplotlib.image.AxesImage at 0x7f3da2493950>
如果一个文件夹里,我们既存放了一些jpg格式的图片, 又存放了一些png格式的图片,现在想把它们全部读取出来,该怎么做呢?
import skimage.io as io
from skimage import data_dir
str=data_dir+'/*.jpg:'+data_dir+'/*.png'
coll = io.ImageCollection(str)
print(len(coll))
26
注意这个地方 data_dir+'/*.jpg:'+data_dir+'/*.png'
,是两个字符串合在一起的。
第一个是 data_dir+'/*.jpg:'
, 第二个是 data_dir+'/*.png'
。
合在一起后,中间用冒号来隔开,这样就可以把文件夹下的 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])
/tmp/ipykernel_77/2705914824.py:3: FutureWarning: `imshow` is deprecated since version 0.25 and will be removed in version 0.27. Please use `matplotlib`, `napari`, etc. to visualize images. io.imshow(coll[10])
<matplotlib.image.AxesImage at 0x7f3da2607b90>
import imageio
vid = imageio.get_reader('/data/cvdata/vtest.avi', 'ffmpeg')
type(vid)
imageio.plugins.ffmpeg.FfmpegFormat.Reader
下面看一下用 skimage
来读取:
def vidread_step(f, step):
vid = imageio.get_reader(f)
seq = [v for v in vid.iter_data()]
return seq[::step]
ic = io.ImageCollection('/data/cvdata/vtest.avi', load_func=vidread_step, step=30)[0]
这段代码的意思,就是将这个视频中每隔 30 帧的图片读取出来,放在图片集合中。
import matplotlib.pyplot as plt
plt.imshow(ic[0])
<matplotlib.image.AxesImage at 0x7f3da823dc10>
plt.imshow(ic[20])
<matplotlib.image.AxesImage at 0x7f3da14dbda0>
得到图片集合以后,我们还可以将这些图片连接起来,构成一个维度更高的数组,连接图片的函数为:
joined = io.concatenate_images(ic)
带一个参数,就是以上的图片集合,如:
from skimage import data_dir,io,color
coll = io.ImageCollection('*.png')
# mat=io.concatenate_images(coll)
使用 concatenate_images()
函数的前提是读取的这些图片尺寸必须一致,否则会出错。
我们看看图片连接前后的维度变化:
连接的图片数量:
print(len(ic))
27
连接前的图片尺寸,所有的都一样:
print(ic[0].shape)
(576, 768, 3)
连接后的数组尺寸
mat=io.concatenate_images(joined)
print(mat.shape)
(27, 576, 768, 3)
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(rgb,(256,256)) #将灰度图片大小转换为256*256
return dst
stra='s*.png'
# coll = io.ImageCollection(stra,load_func=convert_gray)
coll = io.ImageCollection(stra)
for i in range(len(coll)):
io.imsave( f'xx_{i}.png',coll[i]) #循环保存图片
/opt/conda/lib/python3.12/site-packages/skimage/io/collection.py:316: FutureWarning: The plugin infrastructure in `skimage.io` is deprecated since version 0.25 and will be removed in 0.27 (or later). To avoid this warning, please do not pass additional keyword arguments for plugins (`**plugin_args`). Instead, use `imageio` or other I/O packages directly. See also `skimage.io.imread`. self.data[idx] = self.load_func(fname, **kwargs) /opt/conda/lib/python3.12/site-packages/skimage/io/collection.py:316: FutureWarning: The plugin infrastructure in `skimage.io` is deprecated since version 0.25 and will be removed in 0.27 (or later). To avoid this warning, please do not pass additional keyword arguments for plugins (`**plugin_args`). Instead, use `imageio` or other I/O packages directly. See also `skimage.io.imread`. self.data[idx] = self.load_func(fname, **kwargs)
同样的方式,我们把开始读取的视频文件保留成单独的图片:
coll = io.ImageCollection('/data/cvdata/vtest.avi', load_func=vidread_step, step=30)[0]
for i in range(len(coll)):
io.imsave( f'xx_{i}.jpg',coll[i]) #循环保存图片