用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后的結果。可以看出每張圖的顏色都不同,我們可以利用這些新的樣本來訓練神經網路了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM