使用Tensorflow加载,解码,resize_bilinear()然后编码和写入jpeg图像的工作示例?

时间:2018-08-28 00:30:41

标签: tensorflow jpeg bilinear-interpolation

除了下面的这个小程序,我一直无法获得垃圾输出。我只想做

  1. 加载和解码jpeg图像
  2. 使用tf.resize_bilinear将其大小调整为(224,224)
  3. 将其重新编码为jpeg并将其保存到文件中

将tensorflow导入为tf

将numpy导入为np

导入操作系统

从PIL导入图像

cur_dir = os.getcwd()
print("resizing images")
print("current directory:",cur_dir)

def modify_image(image):
    resize_shape = tf.stack([224, 224])
    resize_shape_as_int = tf.cast(resize_shape, dtype=tf.int32)
    #resized = tf.image.resize_bilinear(decoded_image_4d, resize_shape_as_int)
    resized = tf.image.resize_images(image, resize_shape_as_int)
    #image_3d = tf.squeeze(resized, squeeze_dims=[0])
    image_3d = tf.image.convert_image_dtype(resized, tf.uint8, saturate=False)
    return image_3d

def read_image(filename_queue):
    reader = tf.WholeFileReader()
    key,value = reader.read(filename_queue)
    image = tf.image.decode_jpeg(value)
    return key,image

def inputs(args):
    filenames = args.input_files
    filename_queue = tf.train.string_input_producer(filenames)
    filename,read_input = read_image(filename_queue)
    reshaped_image = modify_image(read_input)
    img = tf.image.encode_jpeg(reshaped_image)
    return filename,img

def parse_args():
    a = argparse.ArgumentParser()
    a.add_argument('input_files', nargs='+')
    args = a.parse_args()
    return args

def main():
    args = parse_args()
    with tf.Graph().as_default():
        image = inputs(args)
        init = tf.global_variables_initializer()
        sess = tf.Session()
        sess.run(init)
        tf.train.start_queue_runners(sess=sess)
        filename,img = sess.run(image)
        with open(os.path.join(cur_dir, 'output.jpg'), 'wb') as fh:
            fh.write(img)

if __name__ == '__main__':
    main()

虽然我只是获取垃圾数据,但会输出类似的内容

enter image description here

2 个答案:

答案 0 :(得分:0)

tf.stack接受Tensor对象的列表,而不是整数。

答案 1 :(得分:0)

最新答案。这是一个解决方案,

import tensorflow as tf
from PIL import Image
import numpy as np
import os

img_path = 'path/to/folder/image.bmp'
image_res = [512,512]

def preprocess(img_path):
    img_read = tf.read_file(img_path)
    img_decode = tf.image.decode_bmp(img_read, channels=0)
    img_reshape = tf.expand_dims(img_decode,0)
    img_resize = tf.image.resize_bilinear(img_reshape,size=image_res,align_corners=False)
    img_final = tf.squeeze(img_resize,[0]) # Use to push to tf.keras model
    return img_final

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    res_v1 = sess.run(preprocess(img_path))
    res_v1 = res_v1.astype(np.uint8)
    img_arr_v1 = Image.fromarray(np.squeeze(img_uint8_v1),'L')
    img_arr_v1.save("path/to/output/folder/res_bilinear.jpeg")

希望这会有所帮助。