最近在做图像分类的时候遇到很多数据集中图片的大小都不统一,所以把这个问题单独拿出来讨论一下。
这里主要介绍一下tf.images.resize_imgaes这个函数。前两个参数很好理解,就是你需要resize的图片和你期待的size:[img_width,img_length,n_channels]。
这里的method可以是以下几种:
ResizeMethod.BILINEAR:双线性插值
ResizeMethod.NEAREST_NEIGHBOR:最近的邻居插值
ResizeMethod.BICUBIC:双三次插值
ResizeMethod.AREA:区域插值
上面的方法在python3会报错,所以使用python3的朋友请用如下方法:
method = 0 双线性插值法
method = 1 最近邻居法
method = 2 双三次插值法
method = 3 面积插值法
tf.image.resize_images(
images,
size,
method=ResizeMethod.BILINEAR,
align_corners=False
)
但是这样有可能让图像扭曲QAQ。。。。
以下这个函数可以让横纵坐标比例不变
tf.image.resize_image_with_crop_or_pad(
image,
target_height,
target_width
)
但是上述两者都返回的是一个tensor,但我需要的是一个array,不过问题不大,转化一下就可。
def tensor2array(tensor_img):
with tf.Session() as sess:
tensor_last = tensor_img.eval()
tf.reset_default_graph()
return tensor_last
每次需要释放内存,不然会报错。。。。而且这个resize方法速度很慢,真的很慢。。。。。
opencv的方法速度比较快,
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
src代表原图,dsize表示你需要的尺寸,但是要注意需要用tuple形式表示例如(img_length,img_height)否则就会收到error质问你为什么不用tuple形式。
fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;
fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;
interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:
INTER_NEAREST(最近邻插值)
INTER_CUBIC (三次样条插值)
INTER_LINEAR(线性插值)
INTER_AREA (区域插值)
据说INTER_CUBIC的效果最好,其他还没有尝试,大家感兴趣可以尝试。还是用cv的resize吧哈哈哈哈