07_Numpy渐变图片的生成
如果图片以ndarray格式处理的话,Numpy有丰富的功能可以对已有图片进行处理,从而得到一张新的图片。
例如:之前介绍过的保存,读取等功能。
在此,对渐变图片的生死进行介绍:
- np.tile()和np.linspace()
- 渐变图片生成(代码)
np.tile()和np.linspace()
虽然生成方法有很多中,这里使用以下的方法来生成渐变图像。
- np.linspace()等间距数组的增加或减少
- np.tile()二维数组的排列
渐变的方向只有横,竖。斜面或放射状的渐变不可。
np.linspace()
np.linspace()有开始值(start),结束值(stop),生成个数(num)3个参数,返回的是一个一维数组(等差数列)。
和range(),np.arange()不同的是,隔间数将会自动生成。
import numpy as np
print(np.linspace(0, 10, 3))
# [ 0. 5. 10.]
print(np.linspace(0, 10, 4))
# [ 0. 3.33333333 6.66666667 10. ]
print(np.linspace(0, 10, 5))
# [ 0. 2.5 5. 7.5 10. ]
start值>stop值也能处理。
print(np.linspace(10, 0, 5))
# [10. 7.5 5. 2.5 0. ]
np.tile()
np.tile()是一个可以横,竖排列的函数。对于创建重复图案的阵列很有帮助。
在参数中指定原始数组和重复次数。在二维排列的情况下,重复数为(行的重复数(垂直),列的重复数(水平))。
import numpy as np
a = np.array([0, 1, 2, 3])
print(np.tile(a, 2))
# [0 1 2 3 0 1 2 3]
print(np.tile(a, (3, 2)))
# [[0 1 2 3 0 1 2 3]
# [0 1 2 3 0 1 2 3]
# [0 1 2 3 0 1 2 3]]
print(np.tile(a, (2, 1)))
# [[0 1 2 3]
# [0 1 2 3]]
如果原始数组是二维数组,也可同样适用。
a = np.array([[11, 12], [21, 22]])
print(np.tile(a, 2))
# [[11 12 11 12]
# [21 22 21 22]]
print(np.tile(a, (3, 2)))
# [[11 12 11 12]
# [21 22 21 22]
# [11 12 11 12]
# [21 22 21 22]
# [11 12 11 12]
# [21 22 21 22]]
print(np.tile(a, (2, 1)))
# [[11 12]
# [21 22]
# [11 12]
# [21 22]]
渐变图片生成(代码)
准备一个函数以生成二维的ndarray数组,该数组可以在垂直或水平方向上以相等的间隔增大或减少。该ndarray对应单色灰度图像。当is_horizontal为True时,灰度为水平变化。当is_horizontal为False时,灰度为垂直变化。
def get_gradation_2d(start, stop, width, height, is_horizontal):
if is_horizontal:
return np.tile(np.linspace(start, stop, width), (height, 1))
else:
return np.tile(np.linspace(start, stop, height), (width, 1)).T
这个函数扩展到三个维度。为列表中的每种颜色的值(开始,结束,is_horizonta)3个值,然后调用上述二维版本为每个通道生成渐变图片。
def get_gradation_3d(width, height, start_list, stop_list, is_horizontal_list):
result = np.zeros((height, width, len(start_list)), dtype=np.float)
for i, (start, stop, is_horizontal) in enumerate(zip(start_list, stop_list, is_horizontal_list)):
result[:, :, i] = get_gradation_2d(start, stop, width, height, is_horizontal)
return result
接下来生成实际的渐变图片
array = get_gradation_3d(512, 256, (0, 0, 0), (255, 255, 255), (True, True, True))
Image.fromarray(np.uint8(array)).save('./data/07/gradation_h.jpg', quality=95)
array = get_gradation_3d(512, 256, (0, 0, 0), (255, 255, 255), (False, False, False))
Image.fromarray(np.uint8(array)).save('./data/07/gradation_v.jpg', quality=95)
也可以更改RGB值来调整渐变的方向。
array = get_gradation_3d(512, 256, (0, 0, 192), (255, 255, 64), (True, False, False))
Image.fromarray(np.uint8(array)).save('./data/07/gradation_color.jpg', quality=95)