tf.image.crop_and_resize(
image,
boxes,
box_ind,
crop_size,
method='bilinear',
extrapolation_value=0,
name=None
)
上面是函数的相关参数,首先必须说明官网中有输入tensor的要求,但是我直接输入值也是可以的。这里进行相应的解释:
boxes:指需要划分的区域,输入格式为 [[ymin,xmin,ymax,xmax]] (要注意!这是一个二维列表)。官网在这里讲了一大段,看着简直头晕,大概意思是分了两种情况,一种是超出1另一种就是不超出1的。先将输入值范围为0--1的情况,这里其实是这样:
设crop的区域坐标为 [ y1,x1,y2,x2 ],那么想得到相应正确的crop图形就一定要归!一!化!,即图片长度为 [ W,H ],则实际输入的boxes为 [ y1/H,x1/W,y2/H,x2/W ]。
那超出1的范围是个啥意思咧?程序将为你自动补齐的意思,我试了几次都是直接用空白补齐(也就是补0),不知道大家有没有不一样的结果,注意奥!你的范围要是全部超出1,那就稳稳当当是个黑色框了,因为超出1根据归一化截取不到图片任何内容啦!
box_ind:box_ind与boxes进行配对的,但其指向的是img的索引。具体可以参考
假设
img = [img1, img2]
boxes = [boxes1, boxes2]
box_ind = [ 1 , 0 ]
那么,将返回
[使用boxes1 作用于 img2 后的图片 , 使用boxes2 作用于 img1后的图片]
crop_size:这个参数就可想而知啦,本来这就是我用这个函数的原因,输入一个大小即可,可以忽视通道数量这些
最后贴上我的代码:
import tensorflow as tf
import matplotlib.pyplot as plt
img = plt.imread(r'C:\Users\mjiansun\Desktop\1.jpg')
shape = img.shape
img = img.reshape([1,shape[0], shape[1], shape[2]])
a = tf.image.crop_and_resize(img,[[0.2,0.2,0.6,0.8],[0.5,0.5,1.3,0.9]],
box_ind=[0,0],crop_size=(100,100))
sess = tf.Session()
b = a.eval(session = sess)
# plt.imshow(b[0]/255)
plt.imshow(b[0].astype('uint8'))
plt.show()
得到的图像大小为100*100
有几种特殊情况
第一种情况:出现负数
这时从0开始截取,负数部分补零。
import tensorflow as tf
import matplotlib.pyplot as plt
img = plt.imread(r'C:\Users\mjiansun\Desktop\COCO_test2014_000000000001.jpg')
shape = img.shape
img = img.reshape([1,shape[0], shape[1], shape[2]])
a = tf.image.crop_and_resize(img,[[-0.2,-0.2,0.6,0.8],[0,0,0,0]],
box_ind=[0,0],crop_size=(100,100))
sess = tf.Session()
b = a.eval(session = sess)
# plt.imshow(b[0]/255)
plt.imshow(b[0].astype('uint8'))
plt.show()
原图为
结果为
第二种情况
出现截取部分都为0的时候,那截取出来也还都是0.
import tensorflow as tf
import matplotlib.pyplot as plt
img = plt.imread(r'C:\Users\mjiansun\Desktop\COCO_test2014_000000000001.jpg')
shape = img.shape
img = img.reshape([1,shape[0], shape[1], shape[2]])
a = tf.image.crop_and_resize(img,[[-0.2,-0.2,0.6,0.8],[0,0,0,0]],
box_ind=[0,0],crop_size=(100,100))
sess = tf.Session()
b = a.eval(session = sess)
# plt.imshow(b[0]/255)
plt.imshow(b[1].astype('uint8'))
plt.show()
原图为
结果为