介绍
提取图片中的一小块区域
类似卷积核提取特征,但不同
语法
tf.image.extract_patches(
images,
sizes,
strides,
rates,
padding,
name=None
)
参数:
- images:图像矩阵,形状必须是
[batch, in_rows, in_cols, depth] - sizes:patche大小,形状必须是:
[1, size_rows, size_cols, 1] - strides:patche移动步长,形状必须是
[1, stride_rows, stride_cols, 1] - rates:有些复杂,形状必须是
[1, rate_rows, rate_cols, 1],表示隔几个像素点,取一个像素点,直到满足 sizes 。 - padding:“VALID”或者“SAME”:
"VALID":表示所取的patch区域必须完全包含在原始图像中."SAME"表示可以取超出原始图像的部分,这一部分进行0填充。
返回值
返回4维tensor,数据类型与输入的 images 类型相同
例子
例子1
arr=tf.reshape(tf.range(1,101),[10,10])
print(arr.numpy())
print("-"*50)
arr=tf.reshape(arr,[1,10,10,1])
res=tf.image.extract_patches(images=arr, sizes=[1, 3, 3, 1], strides=[1, 5, 5, 1], rates=[1, 1, 1, 1], padding='VALID')
print(res.numpy())
执行结果:
[[ 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 87 88 89 90]
[ 91 92 93 94 95 96 97 98 99 100]]
---------------------------------
[[[[ 1 2 3 11 12 13 21 22 23]
[ 6 7 8 16 17 18 26 27 28]]
[[51 52 53 61 62 63 71 72 73]
[56 57 58 66 67 68 76 77 78]]]]
解释:
sizes=[1, 3, 3, 1]:patche大小是3x3strides=[1, 5, 5, 1]:patche移动步长5x5。先是水平移动5个,水平移动到终点后,在垂直移动5个rates=[1, 1, 1, 1]:表示patche中的每个元素都提取
- 红色框:patche大小
- 绿色框:patche移动步长
- 橙色框:表示patche中的每个元素都提取
例子2
arr=tf.reshape(tf.range(1,101),[10,10])
print(arr.numpy())
print("-"*50)
arr=tf.reshape(arr,[1,10,10,1])
res=tf.image.extract_patches(images=arr, sizes=[1, 3, 3, 1], strides=[1, 2, 2, 1], rates=[1, 1, 1, 1], padding='VALID')
print(res.numpy())
执行结果:
[[ 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 87 88 89 90]
[ 91 92 93 94 95 96 97 98 99 100]]
--------------------------------------------------
[[[[ 1 2 3 11 12 13 21 22 23]
[ 3 4 5 13 14 15 23 24 25]
[ 5 6 7 15 16 17 25 26 27]
[ 7 8 9 17 18 19 27 28 29]]
[[21 22 23 31 32 33 41 42 43]
[23 24 25 33 34 35 43 44 45]
[25 26 27 35 36 37 45 46 47]
[27 28 29 37 38 39 47 48 49]]
[[41 42 43 51 52 53 61 62 63]
[43 44 45 53 54 55 63 64 65]
[45 46 47 55 56 57 65 66 67]
[47 48 49 57 58 59 67 68 69]]
[[61 62 63 71 72 73 81 82 83]
[63 64 65 73 74 75 83 84 85]
[65 66 67 75 76 77 85 86 87]
[67 68 69 77 78 79 87 88 89]]]]
解释:
sizes=[1, 3, 3, 1]:patche大小是3x3strides=[1, 2, 2, 1]:patche移动步长2x2。先是水平移动2个,水平移动到终点后,在垂直移动2个rates=[1, 1, 1, 1]:表示patche中的每个元素都提取
![]() |
![]() |
![]() |
![]() |
![]() |
例子3
arr=tf.reshape(tf.range(1,101),[10,10])
print(arr.numpy())
print("-"*50)
arr=tf.reshape(arr,[1,10,10,1])
res=tf.image.extract_patches(images=arr, sizes=[1, 3, 3, 1], strides=[1, 5, 5, 1], rates=[1, 2, 2, 1], padding='VALID')
print(res.numpy())
执行结果:
[[[[ 1 3 5 21 23 25 41 43 45]
[ 6 8 10 26 28 30 46 48 50]]
[[ 51 53 55 71 73 75 91 93 95]
[ 56 58 60 76 78 80 96 98 100]]]]
解释:
- sizes=[1, 3, 3, 1]:patch大小是
3x3 - strides=[1, 5, 5, 1]:patche移动步长
5x5。先是水平移动5个,水平移动到终点后,在垂直移动5个 rates=[1, 2, 2, 1]:表示patche中的每个元素间隔1个提取1个,也就是说sizes变成5
例子4
arr=tf.reshape(tf.range(1,101),[10,10])
# print(arr.numpy())
# print("-"*50)
arr=tf.reshape(arr,[1,10,10,1])
res=tf.image.extract_patches(images=arr, sizes=[1, 4, 4, 1], strides=[1, 5, 5, 1], rates=[1, 2, 2, 1], padding='VALID')
print(res.numpy())
执行结果:
[[[[ 1 3 5 7 21 23 25 27 41 43 45 47 61 63 65 67]]]]
解释:
- sizes=[1, 3, 3, 1]:patch大小是
4x4 - strides=[1, 5, 5, 1]:patche移动步长
5x5。先是水平移动5个,水平移动到终点后,在垂直移动5个 rates=[1, 2, 2, 1]:表示patche中的每个元素间隔1个提取1个,也就是说sizes变成7







