问题描述
限时送ChatGPT账号..tf.image.decode_jpeg()
函数对 jpg
图像给出的数值结果与 scipy.misc.imread()
不同.虽然图像看起来相似,但像素值不同.
tf.image.decode_jpeg()
function of Tensorflow gives different numerical result than scipy.misc.imread()
for jpg
images. While the images look similar, pixel values are different.
import numpy as np
import scipy
import tensorflow as tf
import matplotlib.pyplot as plt
def minimal_example():
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
tffilename = 'astronaut.tfrecords'
writer = tf.python_io.TFRecordWriter(tffilename)
#image_source = 'https://upload.wikimedia/wikipedia/commons/8/88/Astronaut-EVA.jpg'
image_path = 'astronaut.jpg'
image_file = open(image_path,'rb')
image = image_file.read()
image_scipy = scipy.misc.imread(image_path)
example = tf.train.Example(features=tf.train.Features(feature={'image':_bytes_feature(image)}))
writer.write(example.SerializeToString())
writer.close()
record_iterator = tf.python_io.tf_record_iterator(path=tffilename)
example = tf.train.Example()
example.ParseFromString(next(record_iterator))
image = example.features.feature['image'].bytes_list.value[0]
image_tf = tf.image.decode_jpeg(image).eval(session=tf.Session())
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.imshow(image_scipy)
ax2.imshow(image_tf)
print('Reconstruction Error', np.sum(np.abs(image_tf - image_scipy)))
plt.show()
结果:
Reconstruction Error 3420883624
这是一个错误还是我做错了什么?
Is this a bug or am I doing something wrong?
推荐答案
出现这种差异是因为 Tensorflow 使用的默认离散余弦变换不准确但速度很快
The discrepancy arises because of inaccurate, but fast, default Discrete Cosine Tranform used by Tensorflow
根据 一个>
According to the Source code
//TensorFlow 选择的 jpeg 解码默认为 IFAST,牺牲
// The TensorFlow-chosen default for jpeg decoding is IFAST, sacrificing
//速度的图像质量.
flags_.dct_method = JDCT_IFAST;
flags_.dct_method = JDCT_IFAST;
为了得到准确的解码,可以设置属性dct_method = 'INTEGER_ACCURATE'
,如下例所示
In order to get accurate decoding one can set the attribute dct_method = 'INTEGER_ACCURATE'
as show in example below
def minimal_example():
#image_source = 'https://upload.wikimedia/wikipedia/commons/8/88/Astronaut-EVA.jpg'
image_path = 'astronaut.jpg'
image_file = open(image_path,'rb')
image_raw = image_file.read()
image_scipy = scipy.misc.imread(image_path)
image_tf = tf.image.decode_jpeg(image_raw).eval(session=tf.Session())
image_tf_accurate = tf.image.decode_jpeg(image_raw,dct_method="INTEGER_ACCURATE").eval(session=tf.Session())
print('Error For Default: ', np.sum(np.abs(image_tf - image_scipy)))
print('Error For Accurate: ', np.sum(np.abs(image_tf_accurate - image_scipy)))
#Error For Default: 3420883624
#Error For Accurate: 0
这篇关于为什么 tensorflow 解码 jpeg 图像与 scipy imread 不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论