# 对图像操作

> 发布于：2021-08-29 | 分类：技能分享 | 原文：https://www.imbailey.cn/post/image-operations-processing

# 图像

### 位图（raster graphics)和矢量图（vector graphics)

位图是有像素的，色彩丰富。矢量图放大不会失真。

### 通道

#### 单通道

灰度图，每个像素点只有一个值表示，如果图像的深度是4-(256 = 2_2_2\*2)，那么他的像素值0(黑)~255(白)；

#### 三通道

也就是通过见到的彩色图，每个像素点有三个值表示，如果图像深度是4-(256 = 2_2_2\*2),那么他的像素值有红(0~255)、绿(0~255)、蓝(0~255)叠加表示，色彩更加艳丽;

#### 四通道

四通道：也就是在三通道图像基础上加上透明程度，Alpha色彩空间，如果图像深度是4-(256 = 2_2_2\*2),那么0是完全透明，255是完全不透明；**png图像是四通道。**

### 读取图片（numpy的array)

```python
import matplotlib.image as mpimg
im = mpimg.imread(fname)
```

读取一张200\*200的png图像

`im.shape() >> (200, 200, 4)`

表示像素是200\*200，有四个通道

数组是这个样子：

![](https://myblog-1257298572.cos.ap-shanghai.myqcloud.com/mypic/wp-content/uploads/2021/08/image-20210811112058185.png)

im\[0\]矩阵，长为200, 宽为4，自己体会一下。

### 显示图片

```
import numpy as np
import matplotlib.pyplot as plt

plt.imshow(arr)
#根据像素绘制图片 origin表示渐变程度
```

### numpy.array 的shape属性理解

#### 二维情况

```python
>>> import numpy as np
>>> y = np.array([[1,2,3],[4,5,6]])
>>> print(y)
[[1 2 3]
 [4 5 6]]
>>> print(y.shape)
(2, 3)
>>> print(y.shape[0])
2
>>> print(y.shape[1])
3
```

可以看到y是一个两行三列的二维数组，y.shape\[0\]代表行数，y.shape\[1\]代表列数。

#### 三维情况

```python
>>> x  = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[0,1,2]],[[3,4,5],[6,7,8]]])
>>>> print(x)
[[[1 2 3]
  [4 5 6]]

 [[7 8 9]
  [0 1 2]]

 [[3 4 5]
  [6 7 8]]]
>>> print(x.shape)
(3, 2, 3)
>>> print(x.shape[0])
3
>>> print(x.shape[1])
2
>>> print(x.shape[2])
3
```

可以看到x是一个包含了3个两行三列的二维数组的三维数组，x.shape\[0\]代表包含二维数组的个数，x.shape\[1\]表示二维数组的行数，x.shape\[2\]表示二维数组的列数。

#### 总结

可以看到，shape\[0\]表示最外围的数组的维数，shape\[1\]表示次外围的数组的维数，数字不断增大，维数由外到内。

> ———————————————— 版权声明：本文为CSDN博主「Lavi\_qq\_2910138025」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。 原文链接：[https://blog.csdn.net/liuweiyuxiang/article/details/79384435](https://blog.csdn.net/liuweiyuxiang/article/details/79384435)

### numpy的梯度函数np.gradient(f)

np.gradient(f):用于计算数组f中元素的梯度，当f为多维时，返回每个维度的梯度。

#### 一维

```python
a = np.random.randint(0,20,(5,))>>array([10,  0,  7,  0, 19])
```

```python
np.gradient(a)>>array([-10. ,  -1.5,   0. ,   6. ,  19. ])
```

由梯度计算公式得到梯度计算结果:

\-10=（0-10）/1

\-1.5=（7-10）/2

#### 二维

```python
c = np.random.randint(0,50,(3,5))
>>array([[25, 49, 14, 13, 20],
       [43,  6, 13, 15, 24],
       [ 9,  2,  7,  5, 36]])
```

```python
np.gradient(c)
>>[array([[ 18. , -43. ,  -1. ,   2. ,   4. ],
        [ -8. , -23.5,  -3.5,  -4. ,   8. ],
        [-34. ,  -4. ,  -6. , -10. ,  12. ]]),
 array([[ 24. ,  -5.5, -18. ,   3. ,   7. ],
        [-37. , -15. ,   4.5,   5.5,   9. ],
        [ -7. ,  -1. ,   1.5,  14.5,  31. ]])]
```

对于二维数组，任意一个元素的梯度存在两个方向，所以求得的梯度为两个数组对象，第一个数组表示最外层维度的梯度值，第二个数组表示第二层维度的梯度值。 对于n维数组，gradient函数会生成n个数组，每个数组代表元素在第n个维度的梯度变化值，梯度反应了元素的变化率，尤其是我们在进行图像，声音等数据处理，梯度有助于帮助我们发现图像和声音的边缘，在那些变化不是很平缓的地方，可以很容易的发现。

> ———————————————— 版权声明：本文为CSDN博主「June �」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。 原文链接：[https://blog.csdn.net/MachineLearner/article/details/104403097](https://blog.csdn.net/MachineLearner/article/details/104403097)
