numpy數(shù)組transpose與圖像使用詳解
基本屬性
首先,了解一點(diǎn)numpy數(shù)組基本屬性。
| 屬性 | 含義 |
|---|---|
| narray.ndim | 秩,維數(shù),一維數(shù)組的秩為1,二維數(shù)組的秩為2 |
| narray.shape | 維度表示,行數(shù)、列數(shù)等 |
| narray.size | 元素總個數(shù), 等于shape屬性中元組元素的乘積 |
| narray.dtype | 元素類型 |
transpose 與 reshape
import numpy as np # 一維數(shù)組transpose無意義 data = np.arange(4) print(data) data = data.transpose() print(data) # 二維數(shù)組,橫縱坐標(biāo)互換 data = np.arange(8).reshape(4, 2) print(data) data = data.transpose() print(data) # 三維數(shù)組,可以理解為2個 3行 * 4列的二維數(shù)組 data = np.arange(24).reshape(2, 3, 4) print(data) # transpose其實(shí)接受參數(shù),不過對于一二維數(shù)組沒有必要 # 參數(shù)可以是0,1,2,可以想象成對應(yīng)x,y,z坐標(biāo) data = data.transpose(2, 1, 0) print(data)
一二維數(shù)組沒有什么好說,三維數(shù)組的transpose找對應(yīng)關(guān)系稍微復(fù)雜,不過相比于尋找具體的對應(yīng)關(guān)系,我覺得更好理解的是:
- 第0個維度:對應(yīng)有多少個二維數(shù)組
- 第1個維度:對應(yīng)每個二維數(shù)組的行數(shù)
- 第2個維度:對應(yīng)每個二維數(shù)組的列數(shù)
舉個簡單例子:
img = Image.open(r"G:\tmp\wbc.jpg") img_arr = np.array(img).astype(np.uint8) print(img_arr.shape) print(img_arr) img_arr = img_arr.transpose(2, 0, 1) print(img_arr.shape) print(img_arr)
一個540 * 720的圖片,通過numpy轉(zhuǎn)為數(shù)組的shape是(720,540,3),相當(dāng)于720個540行3列的數(shù)組,參數(shù)對應(yīng)關(guān)系:
- 第0個維度:720
- 第1個維度:540
- 第2個維度:3

我們可以通過transpose(2, 0, 1),把數(shù)組變?yōu)榈诙€參數(shù)變?yōu)榈?個參數(shù),第0個參數(shù)變?yōu)榈谝粋€,第一個參數(shù)變?yōu)榈诙€,于是:
- 第0個維度:3
- 第1個維度:720
- 第2個維度:540
這樣數(shù)組的shape就變?yōu)?3,720,540),相當(dāng)于3個720行,540列的二維數(shù)組,這樣我們就成功的將RGB分離出來,方便進(jìn)一步計算。

應(yīng)用
白平衡中的灰度世界算法:
import numpy as np
from PIL import Image
def gray_world(src_img_path, dest_img_path):
"""
灰度世界算法
"""
src_img = Image.open(src_img_path)
# 圖形轉(zhuǎn)numpy數(shù)組
image_arr = np.array(src_img).astype(np.uint32)
# 分離RGB
image_arr = image_arr.transpose(2, 0, 1)
avg_red = np.average(image_arr[0])
avg_green = np.average(image_arr[1])
avg_blue = np.average(image_arr[2])
gray = (avg_red + avg_green + avg_blue) / 3
kred = gray / avg_red
kgreen = gray / avg_green
kblue = gray / avg_blue
image_arr[0] = np.minimum(image_arr[0] * kred, 255)
image_arr[1] = np.minimum(image_arr[1] * kgreen, 255)
image_arr[2] = np.minimum(image_arr[2] * kblue, 255)
# 重新合并RGB
image_arr = image_arr.transpose(1, 2, 0)
# numpy數(shù)組轉(zhuǎn)圖像
img = Image.fromarray(image_arr.astype('uint8')).convert('RGB')
img.save(dest_img_path)
if __name__ == '__main__':
img_path = r"G:\tmp\2d.jpg";
gray_world(img_path, r"G:\tmp\gray_world.jpg")
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文詳解凱撒密碼的原理及Python實(shí)現(xiàn)
凱撒密碼是古羅馬愷撒大帝用來對軍事情報進(jìn)行加密的算法,它采用了替換方法對信息中的每一個英文字符循環(huán)替換為字母表序列該字符后面第三個字符。本文主要為大家講解了凱撒密碼的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08
詳解如何使用opencv實(shí)現(xiàn)圖片相似度檢測
這篇文章主要為大家詳細(xì)介紹了如何使用opencv實(shí)現(xiàn)圖片相似度檢測,文中的示例代碼講解詳細(xì),對于我們學(xué)習(xí)人工智能有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

