如何进行图片的平移,滚卷?
简 介: 利用roll, shift函数可以完成对于一维,二维,三维数组的平移、滚卷。利用这种方式对音频信息、图像信息进行操作非常方便。本文中测试这这些方法具体使用方法和效果。
关键词
: 平移,滚卷,图片
§01 数组平移、滚卷
数组的平移(shift)和滚卷(roll)在应用中经常碰到。比如使用数组表示图片,如果需要对于图片进行平移操作,利用数组则比较方便。
在 Python NumPy Shift Array 介绍了三种numpy数组平移和滚卷的方法:
- NumPy Shift Array With the np.roll() Method
- NumPy Shift Array With the Slicing Method in Python
- NumPy Shift Array With shift() Function Inside the scipy.ndimage.interpolation Library in Python
1.1 对于一维数组
1.1.1 利用numpy的roll函数
下面使用Numpy中的roll函数,对于一维数组进行滚卷,可以看到:
- 它可以往两个方向进行滚卷;
- 输出的结果为: numpy array.
a = list(range(10))
b = roll(a, 2)
c = roll(a, -3)
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b: [8 9 0 1 2 3 4 5 6 7]
c: [3 4 5 6 7 8 9 0 1 2]
- 1
- 2
- 3
1.1.2 利用shift函数进行平移
def shift(arr, num, fill_value):
result = empty_like(arr)
if num > 0:
result[:num] = fill_value
result[num:] = arr[:-num]
elif num < 0:
result[num:] = fill_value
result[:num] = arr[-num:]
else:
result[:] = arr
return result
a = list(range(10))
b = shift(a, 2, 99)
c = shift(a, -3, 99)
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b: [99 99 0 1 2 3 4 5 6 7]
c: [ 3 4 5 6 7 8 9 99 99 99]
- 1
- 2
- 3
1.1.3 interpolation
from scipy.ndimage.interpolation import shift
a = list(range(10))
b = shift(a, 2, cval=99)
c = shift(a, -3, cval=99)
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
- 5
- 6
a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b: [99 99 0 1 2 3 4 5 6 7]
c: [ 3 4 5 6 7 8 9 99 99 99]
- 1
- 2
- 3
1.2 对于二维数组
1.2.1 利用numpy的roll函数
x,y = meshgrid(range(10), range(10))
a = x+y
b = roll(a, 2)
c = roll(a, -3)
print("a: {}\n".format(a), "b: {}\n".format(b), "c: {}\n".format(c))
- 1
- 2
- 3
- 4
- 5
a: [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]]
b: [[17 18 0 1 2 3 4 5 6 7]
[ 8 9 1 2 3 4 5 6 7 8]
[ 9 10 2 3 4 5 6 7 8 9]
[10 11 3 4 5 6 7 8 9 10]
[11 12 4 5 6 7 8 9 10 11]
[12 13 5 6 7 8 9 10 11 12]
[13 14 6 7 8 9 10 11 12 13]
[14 15 7 8 9 10 11 12 13 14]
[15 16 8 9 10 11 12 13 14 15]
[16 17 9 10 11 12 13 14 15 16]]
c: [[ 3 4 5 6 7 8 9 1 2 3]
[ 4 5 6 7 8 9 10 2 3 4]
[ 5 6 7 8 9 10 11 3 4 5]
[ 6 7 8 9 10 11 12 4 5 6]
[ 7 8 9 10 11 12 13 5 6 7]
[ 8 9 10 11 12 13 14 6 7 8]
[ 9 10 11 12 13 14 15 7 8 9]
[10 11 12 13 14 15 16 8 9 10]
[11 12 13 14 15 16 17 9 10 11]
[12 13 14 15 16 17 18 0 1 2]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
1.2.2 利用shift函数
def shift(arr, num, fill_value):
result = empty_like(arr)
if num > 0:
result[:num] = fill_value
result[num:] = arr[:-num]
elif num < 0:
result[num:] = fill_value
result[:num] = arr[-num:]
else:
result[:] = arr
return result
x,y = meshgrid(range(10), range(10))
a = x+y
b = shift(a, 2, 99)
c = shift(a, -3, 99)
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
a: [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]]
b: [[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]
[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]]
c: [[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]
[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
1.2.3 利用scipy中的shift函数
from scipy.ndimage.interpolation import shift
x,y = meshgrid(range(10), range(10))
a = x+y
b = shift(a, 2, cval=99)
c = shift(a, -3, cval=99)
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
a: [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]]
b: [[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]
[99 99 0 1 2 3 4 5 6 7]
[99 99 1 2 3 4 5 6 7 8]
[99 99 2 3 4 5 6 7 8 9]
[99 99 3 4 5 6 7 8 9 10]
[99 99 4 5 6 7 8 9 10 11]
[99 99 5 6 7 8 9 10 11 12]
[99 99 6 7 8 9 10 11 12 13]
[99 99 7 8 9 10 11 12 13 14]]
c: [[ 6 7 8 9 10 11 12 99 99 99]
[ 7 8 9 10 11 12 13 99 99 99]
[ 8 9 10 11 12 13 14 99 99 99]
[ 9 10 11 12 13 14 15 99 99 99]
[10 11 12 13 14 15 16 99 99 99]
[11 12 13 14 15 16 17 99 99 99]
[12 13 14 15 16 17 18 99 99 99]
[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]
[99 99 99 99 99 99 99 99 99 99]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
1.3 平移填充最后一行
有的时候,需要将原来的图片内容填充到平移所空出的位置。
from scipy.ndimage.interpolation import shift
x,y = meshgrid(range(10), range(10))
a = x+y
b = shift(a, 2, cval=mean(a[0]))
c = shift(a, -3, cval=mean(a[-1]))
print("a: {}".format(a), "b: {}".format(b), "c: {}".format(c))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
a: [[ 0 1 2 3 4 5 6 7 8 9]
[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]
[ 4 5 6 7 8 9 10 11 12 13]
[ 5 6 7 8 9 10 11 12 13 14]
[ 6 7 8 9 10 11 12 13 14 15]
[ 7 8 9 10 11 12 13 14 15 16]
[ 8 9 10 11 12 13 14 15 16 17]
[ 9 10 11 12 13 14 15 16 17 18]]
b: [[ 5 5 5 5 5 5 5 5 5 5]
[ 5 5 5 5 5 5 5 5 5 5]
[ 5 5 0 1 2 3 4 5 6 7]
[ 5 5 1 2 3 4 5 6 7 8]
[ 5 5 2 3 4 5 6 7 8 9]
[ 5 5 3 4 5 6 7 8 9 10]
[ 5 5 4 5 6 7 8 9 10 11]
[ 5 5 5 6 7 8 9 10 11 12]
[ 5 5 6 7 8 9 10 11 12 13]
[ 5 5 7 8 9 10 11 12 13 14]]
c: [[ 6 7 8 9 10 11 12 14 14 14]
[ 7 8 9 10 11 12 13 14 14 14]
[ 8 9 10 11 12 13 14 14 14 14]
[ 9 10 11 12 13 14 15 14 14 14]
[10 11 12 13 14 15 16 14 14 14]
[11 12 13 14 15 16 17 14 14 14]
[12 13 14 15 16 17 18 14 14 14]
[14 14 14 14 14 14 14 14 14 14]
[14 14 14 14 14 14 14 14 14 14]
[14 14 14 14 14 14 14 14 14 14]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
§02 图片的平移、滚卷
下面通过是后面的方法,来处理一些图片的平移和滚卷。
▲ 图2.1 测试所需要的图片
2.1 图片的滚卷
2.1.1 图片左右滚卷
下面是对原始图像的灰度图图片进行滚卷。
import cv2
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b = roll(a, 250)
c = roll(a, -290)
plt.clf()
plt.figure(figsize=(10,10))
plt.subplot(1,3,1)
plt.imshow(a, plt.cm.gray)
plt.subplot(1,3,2)
plt.imshow(b, plt.cm.gray)
plt.subplot(1,3,3)
plt.imshow(c, plt.cm.gray)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
▲ 图2.1.1 图片滚卷之后的结果
如果直接在原来彩色图片中进行滚卷,颜色层会出现变化。
a = cv2.imread(imgfile)[:,:,::-1]
b = roll(a, 250)
c = roll(a, -292)
- 1
- 2
- 3
▲ 图2.1.2 在彩色图片中进行滚卷
这是因为原来的图片是3D数组,如果滚卷的步骤是三的倍数,则可以完成正常的图片滚卷:
a = cv2.imread(imgfile)[:,:,::-1]
b = roll(a, 250*3)
c = roll(a, -292*3)
- 1
- 2
- 3
▲ 图2.1.3 在彩色图片中进行滚卷
2.1.2 图片上下滚卷
利用 矩阵中的swapaxes 函数,可以实现图片的上下滚卷。
import cv2
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
b = roll(a.swapaxes(0,1), 250*3).swapaxes(0,1)
c = roll(a.swapaxes(0,1), -292*3).swapaxes(0,1)
plt.clf()
plt.figure(figsize=(10,10))
plt.subplot(1,3,1)
plt.imshow(a, plt.cm.gray)
plt.subplot(1,3,2)
plt.imshow(b, plt.cm.gray)
plt.subplot(1,3,3)
plt.imshow(c, plt.cm.gray)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
▲ 图2.1.4 图片的上下滚卷
2.2 图片的平移
2.2.1 灰度图片的平移
(1)对角线平移
from scipy.ndimage.interpolation import shift
import cv2
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b = shift(a, 250, cval=mean(a[0]))
c = shift(a, -290, cval=mean(a[-1]))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
▲ 图2.2.1 图片的平移
(2)上下左右平移
a = cv2.imread(imgfile)[:,:,::-1]
a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b = shift(a, (250, 0), cval=mean(a[0]))
c = shift(a, (-290, 0), cval=mean(a[-1]))
- 1
- 2
- 3
- 4
- 5
▲ 图2.2.2 图片上下平移
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b = shift(a, (0, 250), cval=mean(a[0]))
c = shift(a, (0, -290), cval=mean(a[-1]))
- 1
- 2
- 3
- 4
- 5
- 6
▲ 图2.2.3 图片上下平移
2.2.2 彩色图片平移
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
b = shift(a, (0, 250, 0), cval=mean(a[0]))
c = shift(a, (0, -290, 0), cval=mean(a[-1]))
- 1
- 2
- 3
- 4
- 5
▲ 图2.2.4 图片左右平移
b = shift(a, (250,0, 0), cval=mean(a[0]))
c = shift(a, (-290, 0, 0), cval=mean(a[-1]))
- 1
- 2
▲ 图2.2.5 图片上下平移
※ 实验总结 ※
利用roll, shift函数可以完成对于一维,二维,三维数组的平移、滚卷。利用这种方式对音频信息、图像信息进行操作非常方便。本文中测试这这些方法具体使用方法和效果。
■ 相关文献链接:
● 相关图表链接:
- 图2.1 测试所需要的图片
- 图2.1.1 图片滚卷之后的结果
- 图2.1.2 在彩色图片中进行滚卷
- 图2.1.3 在彩色图片中进行滚卷
- 图2.1.4 图片的上下滚卷
- 图2.2.1 图片的平移
- 图2.2.2 图片上下平移
- 图2.2.3 图片上下平移
- 图2.2.4 图片左右平移
- 图2.2.5 图片上下平移
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2022-01-03
#
# Note:
#============================================================
from headm import * # =
a,b = meshgrid(range(10), range(10))
printt(a:, b:)
#------------------------------------------------------------
x,y = meshgrid(range(10), range(10))
a = x+y
b = roll(a, 2)
c = roll(a, -3)
printt(a:, b:, c:)
#------------------------------------------------------------
def shift(arr, num, fill_value):
result = empty_like(arr)
if num > 0:
result[:num] = fill_value
result[num:] = arr[:-num]
elif num < 0:
result[num:] = fill_value
result[:num] = arr[-num:]
else:
result[:] = arr
return result
#a = list(range(10))
x,y = meshgrid(range(10), range(10))
a = x+y
b = shift(a, 2, 99)
c = shift(a, -3, 99)
printt(a|, b|, c|)
#------------------------------------------------------------
from scipy.ndimage.interpolation import shift
#a = list(range(10))
x,y = meshgrid(range(10), range(10))
a = x+y
b = shift(a, 2, cval=mean(a[0]))
c = shift(a, -3, cval=mean(a[-1]))
printt(a|, b|, c|)
#------------------------------------------------------------
from scipy.ndimage.interpolation import shift
import cv2
imgfile = '/home/aistudio/work/1.jpg'
a = cv2.imread(imgfile)[:,:,::-1]
#a = cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
#b = roll(a.swapaxes(0,1), 250*3).swapaxes(0,1)
#c = roll(a.swapaxes(0,1), -292*3).swapaxes(0,1)
b = shift(a, (250,0, 0), cval=mean(a[0]))
c = shift(a, (-290, 0, 0), cval=mean(a[-1]))
plt.clf()
plt.figure(figsize=(10,10))
plt.subplot(1,3,1)
plt.imshow(a, plt.cm.gray)
plt.subplot(1,3,2)
plt.imshow(b, plt.cm.gray)
plt.subplot(1,3,3)
plt.imshow(c, plt.cm.gray)
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/122406662
- 点赞
- 收藏
- 关注作者
评论(0)