tf.image.extract_patches提取图片区域

介绍

提取图片中的一小块区域

类似卷积核提取特征,但不同

语法

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大小是3x3
  • strides=[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大小是3x3
  • strides=[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


原文出处:/show_1EF5FaeT6qdW.html