Numpy 进阶(二) — 对图像进行旋转、水平、垂直镜像操作!

简介: 原理讲解用 Python 对图片做旋转、镜像操作时,小伙伴们可能首先想到的是 PIL 、Opencv 等图像处理程序包,只需要一行代码就可以实现目标转换。这样做的确能够实预期目标,但图像是怎么实现旋转的,这个过程对我们来说就像一个黑盒子,很陌生,为了了解图像变换机制,这篇文章借助 Numpy 数组来实现图像翻转等操作

原理讲解

用 Python 对图片做旋转、镜像操作时,小伙伴们可能首先想到的是 PIL 、Opencv 等图像处理程序包,只需要一行代码就可以实现目标转换。


这样做的确能够实预期目标,但图像是怎么实现旋转的,这个过程对我们来说就像一个黑盒子,很陌生,为了了解图像变换机制,这篇文章借助 Numpy 数组来实现图像翻转等操作


原理讲解


一张图片的本质是由 a(长) × b(宽) 与图像一样大小的矩阵的像素值组成的,一张照片的呈现因为两点:1,图像中各像素值不一样;2,图像中的像素不是随机排列,需要遵从某种固定的排列方式。一般常见到的 角度旋转、水平镜像图像变换实质上就是图像的排列方式不同  , 如果想实现相应功能需要做的就是把原有排列方式的图像像素拼接成一种新的排列方式为了方便大家理解,特地画了两张图用于展示图像变换的基本原理( 字母 A-I表示像素 ),下面这张图表示的是水平旋转 90度的过程,(本质就是像素点位置的移动,其值不变)微信图片_20220520113110.jpg下面这张图表示图像水平镜像转换过程,原理图:微信图片_20220520113112.jpg旋转180度整个思路就是把角对角像素进行替换:原理图:微信图片_20220520113114.jpg

代码实操

1,展示原图

上面知道图像变换原理,接下来就是代码实现了,要用数组实现转换功能, Numpy  程序包自然是主要工具,首先要做的是读取图像,再借助于函数 numpy.asarray() 把图像转化为数组形式上面知道图像变换原理,接下来就是代码实现了,要用数组实现转换功能, Numpy  程序包自然是主要工具,首先要做的是读取图像,再借助于函数 numpy.asarray() 把图像转化为数组形式

1from PIL import Image

2img_path = 'E:/ceshi/face_recognise/501.jpg'

3img = Image.open(img_path)

4arr = np.asarray(img)

5#打印数组维度

6print(arr.shape)

7ply.imshow(arr)

微信图片_20220520113115.jpgSnipaste_2020-03-27_23-29-04.jpg可以看到数组维度为 354×236×3  , 354236表示的是图像的尺寸大小,后面的3表示的是每个像素值 RGB数值 ,图像变换过程中需要变换的是 354 × 236,主要注意的是,变换过程中不能改变是[r g b] 像素值

2,垂直镜像;

用数组来实现垂直镜像,需要做的只有一步,就是把像素中的行排列逆置即可,代码如下

1arr1 = arr[::-1]

2ply.imshow(arr1)

微信图片_20220520113117.jpg

3,旋转180度

用代码实现的话分为三部分:

  • 利用 reshape(arr.size/3,3) 把所有像素值重新排列成  a*3   二维矩阵:
  • 利用 arr[::-1] 实现数组顺序逆置,把头部逆置到尾部;
  • reshape(arr.shape[0],arr.shape[1],arr.shape[2]) ,把逆置之后的数数组恢复到原数组维度;

1arr2 =arr.copy()

2arr2= arr.reshape(int(arr.size/3),3)#图像像素维度变形为 a*3格式,要保证每个RGB数组不发生改变;

3arr2 =np.array(arr2[::-1])#进行行逆置

4arr2 = arr2.reshape(arr.shape[0],arr.shape[1],arr.shape[2])#再对图像进行一次变换,变成 源图像的维度

5ply.imshow(arr2)

微信图片_20220520113119.jpg

4,水平镜像

水平镜像只需要在旋转180度的数组上面进行一次行逆置即可:

1arr2 =arr.copy()

2arr2= arr.reshape(int(arr.size/3),3)

3arr2 =np.array(arr2[::-1])

4arr2 = arr2.reshape(arr.shape[0],arr.shape[1],arr.shape[2])

5ply.imshow(arr2[::-1])

微信图片_20220520113120.jpg

4,逆时针旋转90度

逆时针旋转 90度的话分为两步:

  • 1,arr2 = arr.transpose(1,0,2) 实现行列置换;
  • 2,arr2 = arr2[::-1] 实现水平镜像;

1arr2 =arr.copy()

2arr2= arr.transpose(1,0,2)#行列转置

3ply.imshow(arr2[::-1])

微信图片_20220520113122.jpg

5,顺时针旋转90度

实现顺时针旋转 90 度,可以在实现逆时针旋转90度的基础上,进行一次180旋转即可:

1arr2 =arr.copy()

2arr2= arr2.transpose(1,0,2)[::-1]

3arr2= arr2.reshape(int(arr2.size/3),3)

4arr2 =np.array(arr2[::-1])

5#恢复原数组维度,这个需要注意,图像长宽尺寸与原图相反;

6arr2 = arr2.reshape(arr.shape[1],arr.shape[0],arr.shape[2])

7ply.imshow(arr2)

微信图片_20220520113124.jpg好了以上就是本篇文章的基本内容,最后感谢阅读!

相关文章
|
5月前
|
BI 索引 Python
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
利用Numpy读取iris数据集并进行排序、去重、求统计量等操作实战(附源码)
303 0
|
存储 数据可视化 数据挖掘
【数据分析入门】Numpy进阶
【数据分析入门】Numpy进阶
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
PyTorch基础之张量模块数据类型、基本操作、与Numpy数组的操作详解(附源码 简单全面)
69 0
|
3月前
|
数据处理 Python
数据科学进阶之路:Pandas与NumPy高级操作详解与实战演练
【7月更文挑战第13天】探索数据科学:Pandas与NumPy提升效率的高级技巧** - Pandas的`query`, `loc`和`groupby`用于复杂筛选和分组聚合,例如筛选2023年销售额超1000的记录并按类别计总销售额。 - NumPy的广播和向量化运算加速大规模数据处理,如快速计算两个大数组的元素级乘积。 - Pandas DataFrame基于NumPy,二者协同加速数据处理,如将DataFrame列转换为NumPy数组进行标准化再回写,避免链式赋值。 掌握这些高级操作,实现数据科学项目的效率飞跃。
53 0
|
4月前
|
Python
如何查询RGB图像的三维numpy数组中有多少个不同的RGB点,并打印具体数值?
如何查询RGB图像的三维numpy数组中有多少个不同的RGB点,并打印具体数值?
|
4月前
|
机器学习/深度学习 人工智能 IDE
人工智能平台PAI操作报错合集之交互式建模(DSW)环境中,numpy模块如何正确安装
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
存储 测试技术 程序员
【Python】—— NumPy基础及取值操作
【Python】—— NumPy基础及取值操作
|
5月前
|
存储 数据挖掘 vr&ar
深入探索Numpy--索引,切片,随机数,文本操作等
深入探索Numpy--索引,切片,随机数,文本操作等
|
5月前
|
数据处理 C语言 索引
使用NumPy进行科学计算:基础与进阶
【4月更文挑战第9天】NumPy是数据处理和科学计算的核心工具,提供高性能的多维数组对象和数学函数库。本文深入讲解NumPy的基础和进阶技巧,包括ndarray的向量化操作、广播机制、ufunc、高级索引以及线性代数操作。通过示例展示如何利用NumPy进行高效计算,强调性能优化,帮助读者提升科学计算能力。
49 6
|
机器学习/深度学习 存储 数据挖掘
【100天精通Python】Day53:Python 数据分析_NumPy数据操作和分析进阶
【100天精通Python】Day53:Python 数据分析_NumPy数据操作和分析进阶
84 0