3分鐘學會用python處理圖片(矩陣)填充的簡單方法

如題,特別是在做圖像處理的時候,我們遇到了一個圖片是500*500*3的,另一個是600*500*3的,我們不論是做深度學習還是算歐氏距離啊什麼總是因爲這些圖片的維度不同而頭疼,但是很遺憾,你們這個頭疼的問題在3分鐘之後即將再也不復存在,爲什麼需要三分鐘呢?因爲我的博客你閱讀需要三分鐘!!!

直接上代碼!!!!

#!D:/workplace/python
# -*- coding: utf-8 -*-
# @File  : 矩陣裁剪.py
# @Author: WangYe
# @Date  : 2019/3/8
# @Software: PyCharm
import numpy as np
import tensorflow as tf
x = [[1,1],[1,1]]
x = np.asarray(x)
matrix_pad = np.pad(x,pad_width=((1, 2),#向上填充1個維度,向下填充兩個維度
                                 (2, 1))#向左填充2個維度,向右填充一個維度
                    ,mode="constant",#填充模式
                    constant_values=(6, 5)  #第一個維度(就是向上和向左)填充6,第二個維度(向下和向右)填充5
                    )
print(matrix_pad)

代碼的註釋已經寫得非常清楚了,如果這還不清楚請看下面的運行結果:

C:\Anaconda\python.exe D:/code/python/Test/矩陣裁剪.py
[[6 6 6 6 5]
 [6 6 1 1 5]
 [6 6 1 1 5]
 [6 6 5 5 5]
 [6 6 5 5 5]]

Process finished with exit code 0

唉,這下是不是很清楚了?

當然,這個是一個2*2的矩陣填充,如果是2*2*3的呢?就是3通道的2*2的圖片呢?那肯定是把每個2*2的填充,通道數不變,即變成5*5*3的啦,就像這樣:

matrix_pad = np.pad(x,pad_width=((1, 2),#向上填充1個維度,向下填充兩個維度
                                 (2, 1),#向左填充2個維度,向右填充一個維度
                                 (0,0)) #通道數不填充
                    ,mode="constant",#填充模式
                    constant_values=(6, 5)  #第一個維度(就是向上和向左)填充6,第二個維度(向下和向右)填充5

但是,有很多人在做圖像處理的時候拿到的是一大堆圖片,這裏面圖片的維度很多都不相等,我們該怎麼辦?不要急不要慌,懶骨頭707來幫你忙!!!

例如,我們這裏三張圖片,分別是    500*600*3,400*500*3,900*500*3,那麼我們爲了不丟失關鍵的圖片信息,我們肯定採用填充而不是裁剪,那我們肯定去各個維度的最大值進行填充,那麼每個圖片都是900*600*3的,但是填充的時候有個技巧,那就是要把圖片放在中間,比如吧500*600的換成900*600的,那500變900肯定是上面填充200,下面填充200啊。

在大量圖片中,你有可能輸入是一個list,然後list裏面的每個元素是你的圖片矩陣,所以,我這裏放出一個函數,你直接調用就可,簡直是圖片處理的福利

def image_padding(data,dim):  #圖片填充  data是輸入的圖片列表,列表裏面是每個圖片的維度,dim是圖片的通道數
                                                            #dim = 1 是灰色的,3是彩色的
    data_out =[]
    length = []
    weight = []
    for x in data:
        weidu = x.shape
        # print(weidu[0])
        # print(weidu[1])
        # print(type(weidu))
        length.append(weidu[0])
        weight.append(weidu[1])
    # print(max(length))#450
    # print(max(weight))#450
    MAX_l = max(length)  #讀取長的最大值
    MAX_W = max(weight)  #寬的最大值
    '''
    開始填充矩陣
    '''
    for x in data:
        temp_tuple = x.shape  # 獲取當前矩陣維度
        length = temp_tuple[0]  # 讀取長
        width = temp_tuple[1]  # 讀取寬
        pad_length_up = int((MAX_l - length) / 2)  # 長的向上填充
        pad_length_down = int(MAX_l - length - pad_length_up)
        pad_width_left = int((MAX_W - width) / 2)
        pad_width_right = int(MAX_W - width - pad_width_left)
        matrix_pad = []
        if int(dim) == 3:
            matrix_pad = np.pad(x,
                                pad_width=((pad_length_up, pad_length_down),
                                           (pad_width_left, pad_width_right),
                                           (0, 0)  # 三維處理成一維之後就不用了
                                           ),
                                mode="constant", constant_values=(0, 0))
        if int(dim) == 1:   #即1維灰度圖
            matrix_pad = np.pad(x,
                                pad_width=((pad_length_up, pad_length_down),
                                           (pad_width_left, pad_width_right),
                                           # (0, 0)  # 三維處理成一維之後就不用了
                                           ),
                                mode="constant", constant_values=(0, 0))



        # print(matrix_pad.shape)
        np.array(matrix_pad).reshape((MAX_l,MAX_W,dim))
        temp_list = []
        temp_list.append(matrix_pad)
        # np.asarray(matrix_pad).reshape(MAX_l,MAX_W,1)
        q=np.asarray(temp_list).reshape(MAX_l,MAX_W,dim)
        # print(q.shape)
        data_out.append(q)
    out = np.asarray(data_out)
    # out.reshape(MAX_l,MAX_W,1)
    # print(out.shape)  
    return out  #輸出是已經處理好的矩陣,例如 (1450,500,500,3)1450張500*500的三通道圖片

我的代碼比較通俗易懂,能夠讓你3分鐘看懂,如果你3分鐘沒有看懂,那就請你載入下一個3分鐘,哈哈哈哈哈

如果對你有幫助請點贊,有疑問請評論,我都會一一回復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章