美文网首页Python数字图像处理Opencv-Python
Python数字图像处理(6):图像的批量处理

Python数字图像处理(6):图像的批量处理

作者: 自律小生 | 来源:发表于2017-02-28 00:11 被阅读303次

    有些时候,我们不仅要对一张图片进行处理,可能还会对一批图片处理。这时候,我们可以通过循环来执行处理,也可以调用程序自带的图片集合来处理。
    图片集合函数为:
    skimage.io.ImageCollection(load_pattern, load_func=None)
    这个函数是放在io模块内的,带两个参数,第一个参数load_pattern, 表示图片组的路径,可以是一个str字符串。第二个参数load_func是一个回调函数,我们对图片进行批量处理就可以通过这个回调函数实现。回调函数默认为imread(),即默认这个函数是批量读取图片。
    比如我们可以利用它将一组图片读入:

        from skimage import io, data_dir
        data_path_str = data_dir + '/*.png'
        images = io.ImageCollection(data_path_str)
        print(len(images))
    

    显示结果为24, 说明系统自带了24张png的示例图片,这些图片都读取了出来,放在图片集合images里。如果我们想显示其中一张图片,则可以在后加上两行代码:

        io.imshow(images[1])
        io.show()
    

    显示结果:



    如果一个文件夹里,我们既存放了一些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 io, data_dir, color
    
        def convert_to_gray(f, **args):
            image = io.imread(f)
            image = color.rgb2gray(image)
            return image
    
        data_path = data_dir + '/*.png'
        collections = io.ImageCollection(data_path, load_func=convert_to_gray)
        io.imshow(collections[1])
        io.show()
    
    gray image

    这种批量操作对视频处理是极其有用的,因为视频就是一系列的图片组合

        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)  #连接后的数组尺寸
    

    相关文章

      网友评论

      • 199e3e3f5415:你好,出现读取两种格式图片比如jpg和JPG,图片有的会重复读进来,怎么办?

      本文标题:Python数字图像处理(6):图像的批量处理

      本文链接:https://www.haomeiwen.com/subject/qbwtgttx.html