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好了以上就是本篇文章的基本内容,最后感谢阅读!

相关文章
|
3月前
|
Python
【Numpy】实现0变1和1变0即取反操作
【Numpy】实现0变1和1变0即取反操作
39 0
|
4月前
|
索引 Python
Python中NumPy库的相关操作
Python中NumPy库的相关操作
46 0
|
5月前
|
Python
CV5 numpy入门及图像的基本操作
复制法,即复制最边缘的像素。
30 0
|
7月前
|
算法 计算机视觉 索引
【菜菜的CV进阶之路-基础库的使用-Numpy】按指定条件筛选numpy ndarray数据并进行操作
【菜菜的CV进阶之路-基础库的使用-Numpy】按指定条件筛选numpy ndarray数据并进行操作
110 0
|
8月前
|
机器学习/深度学习 计算机视觉 Python
基于Numpy数组的图像分割 基于PIL对图像进行拼接
基于Numpy数组的图像分割 基于PIL对图像进行拼接
131 0
基于Numpy数组的图像分割 基于PIL对图像进行拼接
|
9月前
|
存储 Python
【NumPy高级运用】NumPy的Matrix与Broadcast高级运用以及IO操作
【NumPy高级运用】NumPy的Matrix与Broadcast高级运用以及IO操作
【NumPy高级运用】NumPy的Matrix与Broadcast高级运用以及IO操作
|
9月前
|
算法 数据挖掘 定位技术
在向量化NumPy数组上进行移动窗口操作
在向量化NumPy数组上进行移动窗口操作
178 0
在向量化NumPy数组上进行移动窗口操作
|
9月前
|
机器学习/深度学习 存储 索引
NumPy中的广播:对不同形状的数组进行操作
NumPy中的广播:对不同形状的数组进行操作
57 0
NumPy中的广播:对不同形状的数组进行操作
|
9月前
|
存储 Python
每个数据科学家都应该知道的20个NumPy操作
每个数据科学家都应该知道的20个NumPy操作
61 0
每个数据科学家都应该知道的20个NumPy操作
|
9月前
|
计算机视觉 Python
【opencv】图像数据类型由numpy转为tensor后颜色改变
【opencv】图像数据类型由numpy转为tensor后颜色改变
164 1
【opencv】图像数据类型由numpy转为tensor后颜色改变
相关产品
云迁移中心
推荐文章
更多