zoukankan      html  css  js  c++  java
  • 用numpy.pad()对图像进行填充及简单的图像处理

    三、用numpy.pad()对图像进行填充及简单的图像处理

    一、用numpy.pad()对图像进行填

    我们都知道在css的盒子模型中,有padding(内边距)这一属性。同css中的padding类似,在numpy中,numpy.pad()可以跟矩阵添加内边距,这一方法在CNN中的卷积层可以用到,可以影响到卷积后矩阵的维度,其用法如下:

    numpy.pad(array, pad_width, mode, **kwargs)[source]

    其中array是需要添加内边距的矩阵。pad_width对应矩阵每个维度填充的宽度,其格式是这样的:((befor,afte),(befor,afte)((before1,after1),…(beforeN,afterN)) ,(befor,afte(beforeN,afterN) 表示第n维之前和时候填充的宽度。mode表示填充矩阵的值的模式,对应有:”constant“——表示用一个常量填充矩阵,“minimum”——用某个维度上的最小值填充矩阵,等其他模式。具体可参照官方APInumpy.pad。下面看一个用numpy.pad填充图像的例子,代码如下:

    import pylab
    import numpy as np
    from scipy import ndimage
    import matplotlib.pyplot as plt
    
    dir = "./testImgs/"
    filename = dir + "la_defense.jpg"
    ori_image = np.array(ndimage.imread(filename, flatten=False))
    dim1_pad = np.pad(ori_image, ((50, 50), (0, 0), (0, 0)), 'constant', constant_values=0)
    dim2_pad = np.pad(ori_image, ((0, 0), (50, 50), (0, 0)), 'maximum')
    dim3_pad = np.pad(ori_image, ((50, 50), (50, 50), (0, 0)), 'constant', constant_values=200)
    print("origin shape:" + str(ori_image.shape))
    print("vertical pad:" + str(dim1_pad.shape))
    print("horizontal pad:" + str(dim2_pad.shape))
    print("all pad:" + str(dim3_pad.shape))
    
    fig, axarr = plt.subplots(2, 2)
    axarr[0, 0].imshow(ori_image)
    axarr[0, 1].imshow(dim1_pad[:, :, 0])
    axarr[1, 0].imshow(dim2_pad[:, :, 1])
    axarr[1, 1].imshow(dim3_pad[:, :, 2])
    pylab.show()
    

      

    显示的结果如下:

    这里写图片描述

    以上代码中用到了scipy.ndimage.imread读取图片,可以结合我的另一篇博客二、使用scipy读图片并改变图片大小进行理解。读到的图片是一个(1181,1181,3)的3维矩阵,第三维表示RGB三个通道。我分别在R、B、G三个通道上进行了填充,第二张图是在R通道的第一维(上下)分别填充50的像素的宽度,第三张图是在G通道的第二维(左右)分别填充50的像素的宽度(模式为minimum),第四张图是在B通道的第一、二维分别分别填充50的像素的宽度。可以看出,这四张图都是不一样的(尽管第三、四张图差别不大),填充后矩阵的维度如下:
    这里写图片描述

    二、简单的图像处理

    在利用CNN进行图片分类的时候,有时候会缺少样本,我们可以通过用已有的样本来自己创建新的样本,如图像的旋转,裁剪,图像颜色的改变等。下面是通过改变图像的颜色来创建新的图片,代码如下:

    import pylab
    import numpy as np
    from scipy import ndimage
    import matplotlib.pyplot as plt
    
    
    def new_pic_arr(dim0, dim1, dim2, dim0_plus, dim1_plus,dim2_plus):
        pic = np.zeros((1181, 1181, 3), dtype=np.uint8)
        pic[:, :, 0] = dim0 + dim0_plus
        pic[:, :, 1] = dim1 + dim1_plus
        pic[:, :, 2] = dim2 + dim2_plus
        return pic
    
    dir = "./testImgs/"
    filename = dir + "la_defense.jpg"
    ori_image = np.array(ndimage.imread(filename, flatten=False))
    dim0 = ori_image[:, :, 0]
    dim1 = ori_image[:, :, 1]
    dim2 = ori_image[:, :, 2]
    
    pic1 = new_pic_arr(dim0, dim1, dim2, 30, 0, 30)
    pic2 = new_pic_arr(dim0, dim1, dim2, 40, 40, 0)
    pic3 = new_pic_arr(dim0, dim1, dim2, 0, 40, 40)
    
    fig, axarr = plt.subplots(2, 2)
    axarr[0, 0].imshow(ori_image)
    axarr[0, 1].imshow(pic1)
    axarr[1, 0].imshow(pic2)
    axarr[1, 1].imshow(pic3)
    pylab.show()
    

      

    最后的结果如下:

    这里写图片描述

    上述中的四副图中,图一是原始的图,图二是在原图的R、B通道上每个像素的值增加30后的结果,图三是在原图的R、G通道上每个像素的值增加40后的结果,图四是在原图的G、B通道上每个像素的值增加40后的结果。可以看出每张图的颜色都不同,我们可以利用这些新的样本来训练神经网路了。

  • 相关阅读:
    Codeforces Round #481 (Div. 3)题解
    陕西师范大学第七届程序设计竞赛网络同步赛题解
    Codeforces Round #479 (Div. 3)题解
    2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛题解
    江西财经大学第一届程序设计竞赛题解
    2018年湘潭大学程序设计竞赛G又见斐波那契
    2018年长沙理工大学第十三届程序设计竞赛题解
    JDBC连接SQL server2014代码
    数据定义伪指令语句
    JDBC连接数据库
  • 原文地址:https://www.cnblogs.com/accumulationbystep/p/10419046.html
Copyright © 2011-2022 走看看