五、skimage图像的批量处理

1、ImageCollection批量操作图片

有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理。这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理。

图片集合函数为:

skimage.io.ImageCollection(load_pattern,load_func=None)

这个函数是放在 io 模块内的,带两个参数,第一个参数load_pattern, 表示图片组的路径,可以是一个str字符串。第二个参数load_func是一个回调函数,我们对图片进行批量处理就可以通过这个回调函数实现。回调函数默认为imread(),即默认这个函数是批量读取图片。

# -*- coding: utf-8 -*-
# @Time : 2019/12/10 0:37
# @Author : sxp
# @Email : 
# @File : data_type.py
# @Project : python_common

from skimage import io,data_dir,color
import numpy as np

def show_img(img):
    io.imshow(img)
    io.show()

def convert_gray(f):
    rgb = io.imread(f)
    return  color.rgb2gray(rgb)

if __name__ == '__main__':
    path = r"E:\PythonProjects\python_common\skimage\images\lena.jpg"
    # img = io.imread(path)
    print("#############skimage自带图片集合###############")
    str = data_dir + '/*.png'
    coll = io.ImageCollection(str)
    print('coll num = {}'.format(len(coll)))
    show_img(coll[0])
    print("#############同时读取批量多格式图片###############")
    str = 'E:\PythonProjects\python_common\skimage\images\*.jpg;' \
          'E:\PythonProjects\python_common\skimage\images\*.png'
    coll_1 = io.ImageCollection(str)
    print('coll_1 num = {}'.format(len(coll_1)))

io.ImageCollection()这个函数省略第二个参数,就是批量读取。如果我们不是想批量读取,而是其它批量操作,如批量转换为灰度图,那又该怎么做呢?

那就需要先定义一个函数,然后将这个函数作为第二个参数,如:

# -*- coding: utf-8 -*-
# @Time : 2019/12/10 0:37
# @Author : sxp
# @Email : 
# @File : data_type.py
# @Project : python_common

from skimage import io,data_dir,color
import numpy as np

def show_img(img):
    io.imshow(img)
    io.show()

def convert_gray(f):
    rgb = io.imread(f)
    return  color.rgb2gray(rgb)

if __name__ == '__main__':
    path = r"E:\PythonProjects\python_common\skimage\images\lena.jpg"
    # img = io.imread(path)
    print("#############skimage自带图片集合###############")
    str = data_dir + '/*.png'
    coll = io.ImageCollection(str,load_func=convert_gray)
    print('coll num = {}'.format(len(coll)))
    show_img(coll[0])

2、用于视频处理

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)

3、例:把系统自带的所有png示例图片,全部转换成256*256的jpg格式灰度图,保存在d:/data/文件夹下

改变图片的大小,我们可以使用tranform模块的resize()函数,后续会讲到这个模块。

# -*- coding: utf-8 -*-
# @Time : 2019/12/10 0:37
# @Author : sxp
# @Email : 
# @File : data_type.py
# @Project : python_common

from skimage import io,data_dir,color,transform
import numpy as np

def show_img(img):
    io.imshow(img)
    io.show()

def convert_gray(f):
    rgb = io.imread(f)
    gray = color.rgb2gray(rgb)
    dst = transform.resize(gray,(256,256))
    return dst

if __name__ == '__main__':
    path = r"E:\PythonProjects\python_common\skimage\images\lena.jpg"
    save_dir = r''
    # img = io.imread(path)
    print("#############skimage自带图片集合###############")
    str = data_dir + '/*.png'
    coll = io.ImageCollection(str,load_func=convert_gray)
    for i in range(len(coll)):
        io.imsave(save_dir+np.str(i)+'.jpg',coll[i])

猜你喜欢

转载自blog.csdn.net/s294878304/article/details/103467916