numpy数组transpose与图像使用详解

 更新时间:2025年09月02日 10:53:35   作者:trayvontang  
文章介绍numpy数组的基本属性及三维数组transpose操作,通过调整维度顺序将RGB分离,应用在白平衡的灰度世界算法中

基本属性

首先,了解一点numpy数组基本属性。

属性含义
narray.ndim秩,维数,一维数组的秩为1,二维数组的秩为2
narray.shape维度表示,行数、列数等
narray.size元素总个数, 等于shape属性中元组元素的乘积
narray.dtype元素类型

transpose 与 reshape

import numpy as np

# 一维数组transpose无意义
data = np.arange(4)
print(data)
data = data.transpose()
print(data)


# 二维数组,横纵坐标互换
data = np.arange(8).reshape(4, 2)
print(data)
data = data.transpose()
print(data)

# 三维数组,可以理解为2个 3行 * 4列的二维数组
data = np.arange(24).reshape(2, 3, 4)
print(data)

# transpose其实接受参数,不过对于一二维数组没有必要
# 参数可以是0,1,2,可以想象成对应x,y,z坐标
data = data.transpose(2, 1, 0)
print(data)

一二维数组没有什么好说,三维数组的transpose找对应关系稍微复杂,不过相比于寻找具体的对应关系,我觉得更好理解的是:

  1. 第0个维度:对应有多少个二维数组
  2. 第1个维度:对应每个二维数组的行数
  3. 第2个维度:对应每个二维数组的列数

举个简单例子:

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转为数组的shape是(720,540,3),相当于720个540行3列的数组,参数对应关系:

  1. 第0个维度:720
  2. 第1个维度:540
  3. 第2个维度:3

我们可以通过transpose(2, 0, 1),把数组变为第二个参数变为第0个参数,第0个参数变为第一个,第一个参数变为第二个,于是:

  1. 第0个维度:3
  2. 第1个维度:720
  3. 第2个维度:540

这样数组的shape就变为(3,720,540),相当于3个720行,540列的二维数组,这样我们就成功的将RGB分离出来,方便进一步计算。

应用

白平衡中的灰度世界算法:

import numpy as np
from PIL import Image


def gray_world(src_img_path, dest_img_path):
    """
    灰度世界算法
    """
    src_img = Image.open(src_img_path)
    # 图形转numpy数组
    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数组转图像
    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")

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python学习笔记(一)(基础入门之环境搭建)

    Python学习笔记(一)(基础入门之环境搭建)

    本系列为Python学习相关笔记整理所得,IT人,多学无害,多多探索,激发学习兴趣,开拓思维,不求高大上,只求懂点皮毛,作为知识储备,不至于落后太远。本文主要介绍Python的相关背景,环境搭建。
    2014-06-06
  • matplotlib交互式数据光标mpldatacursor的实现

    matplotlib交互式数据光标mpldatacursor的实现

    这篇文章主要介绍了matplotlib交互式数据光标mpldatacursor的实现 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python中ransac算法拟合圆的实现

    python中ransac算法拟合圆的实现

    RANSAC是一种用于从包含异常数据的样本数据集中计算数学模型参数的算法,本文主要介绍了python中ransac算法拟合圆的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Python中的缩进是什么意思

    Python中的缩进是什么意思

    在Python中,缩进是指在代码中使用空格或制表符来表示代码块的层次结构,Python使用缩进作为语法的一部分,以定义代码的逻辑结构和代码块的范围,本文介绍Python中的缩进是什么意思,感兴趣的朋友一起看看吧
    2024-01-01
  • Python之py2exe打包工具详解

    Python之py2exe打包工具详解

    下面小编就为大家带来一篇Python之py2exe打包工具详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Python 调用API发送邮件

    Python 调用API发送邮件

    这篇文章主要介绍了Python 调用API发送邮件的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-03-03
  • Python matplotlib画曲线例题解析

    Python matplotlib画曲线例题解析

    这篇文章主要介绍了Python matplotlib画曲线例题解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python+OpenCV图像处理——实现直线检测

    Python+OpenCV图像处理——实现直线检测

    这篇文章主要介绍了Python+OpenCV如何实现直线检测,帮助大家更好的利用python处理图片,感兴趣的朋友可以了解下
    2020-10-10
  • python pandas loc 布尔索引示例说明

    python pandas loc 布尔索引示例说明

    loc跟iloc的区别,首先loc是location的意思,和iloc中i的意思是指integer,所以它只接受整数作为参数,详情见下面
    2022-03-03
  • python基础入门之普通操作与函数(三)

    python基础入门之普通操作与函数(三)

    这篇文章主要介绍了python基础入门之普通操作与函数
    2021-06-06

最新评论