图像的字节表示根据用于读取它的方法而有所不同

时间:2018-03-28 11:16:56

标签: python image tensorflow

我试图在tensorflow中的对象检测模型中执行一些数据扩充,所以我检查了不同图像表示的兼容性。

首先,我只是使用PILPillow准确)阅读图像文件

full_path = 'path/to/my/image.jpg'
image = PIL.Image.open(full_path)
image_np = np.array(image)
encoded_jpg_io1 = io.BytesIO(image_np)

然后我使用了tensorflow版本(也用于创建tfrecords):

with tf.gfile.GFile(full_path, 'rb') as fid:
    encoded_jpg = fid.read()
encoded_jpg_io2 = io.BytesIO(encoded_jpg)

然后我检查了上述操作的相等性:

if encoded_jpg_io1 == encoded_jpg_io2:
    print('Equal')

我期待那两个人是平等的。那么,为什么这不是这里的情况呢?

如果我使用字节,我会得到相同的结果:

v1 = encoded_jpg_io1.getvalue()
v2 = encoded_jpg_io2.getvalue()
if encoded_jpg_io1.getvalue() == encoded_jpg_io2.getvalue():
    print('Equal')
if v1.__eq__(v2):
    print('Equal')

我需要用numpy操作我的图像,然后创建一些tfrecords,这样就需要相等。

一些有趣的事实:
 1. PIL根本无法以np.array格式阅读图片:

image1 = PIL.Image.open(encoded_jpg_io1)
  

OSError:无法识别图像文件

使用GFile时工作正常:

image2 = PIL.Image.open(encoded_jpg_io2)

2. PIL图片无法直接转换为BytesIO

encoded_jpg_io1 = io.BytesIO(image)
  

TypeError:需要类似字节的对象,而不是'JpegImageFile'

0 个答案:

没有答案