主要介绍python和tensorflow中各种格式的图片处理
一、图片的读入
PIL.Image读入图片(RGB格式)
from PIL import Image
def PIL_open():
image=Image.open('lena.png')
image.show()
cv2读入图片 (GBR格式)
import cv2
def cv2_open():
image=cv2.imread('lena.png')
cv2.imshow('lena',image)
cv2.waitKey()
PIL.Image和cv2之间的格式转换:
def cv2_to_PIL():
image=cv2.imread('lena.png')
image=Image.fromarray(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
image.show()
def PIL_to_cv2():
image=Image.open('lena.png')
image=cv2.cvtColor(np.asarray(image),cv2.COLOR_RGB2BGR)
cv2.imshow('lena',image)
cv2.waitKey()
二、图片的存储
#cv2:
cv2.imwrite('img.jpg', img) #img是np.ndarray
#PIL:
img = Image.fromarray(np_array)
img.save('img.jpg')
三 、图片与np.ndarray之间的转换
image = Image.open('a.jpg')
array = np.array(image) #shape为(h, w, c), dtype为np.uint8
cv2.imread()得到的就是np.ndarray格式
四、图片和原始字节之间的转换
np.ndarray转换为byterray:
barray = bytearray(img) #img是np.ndarray, barray是标准一维python bytearray,如b'\x87K\xcdz>\xc0~B\xc4\'
bytearray转换为np.ndarray:
img = np.array(barray).reshape(32, 32, 3)
np.ndarray转换为bytes:
bs = img.tobytes() #img是np.ndarray
bytes貌似不能直接转为np.ndarray, np.array(bs)得到的是字符串格式。需要先将bytes转化为byterarray?
bytearray和bytes的值是相同的,区别在于bytearray可变,bytes不可变。从bytes转为bytearray:
barr = batearray(bytes_object)
四、tensorflow读取图片
如果文件是jpg、png、bmp、gif等格式,其编码格式不是按照图片像素值直接编码的,必须调用tf.image.decode_jpeg(png、bmp、gif、image)来解码。如果直接tf.decode_raw无法得到正确的数据
img_raw = tf.gfile.FastGFile('lyf.jpg', 'rb').read()
img_jpg = tf.image.decode_jpeg(img_raw)
with tf.Session() as sess:
img = sess.run(img_jpg)
如果文件是pickle、tfrecord等格式,编码时是直接把像素值编码,读取时先解码,再根据原文件格式还原
path = 'cifar-10-batches-py/data.tfrecord'
reader = tf.TFRecordReader()
fname_queue = tf.train.input_producer([path])
_, example = reader.read(fname_queue)
features = tf.parse_single_example(example,
features={'label': tf.FixedLenFeature([], tf.int64),
'raw_img': tf.FixedLenFeature([], tf.string)})
img = tf.reshape(tf.decode_raw(features['raw_img'], tf.uint8), [32, 32, 3])
label = features['label']
with tf.Session() as sess:
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
while True:
im, lab = sess.run([img, label])
plt.imshow(im)
plt.title(lab)
break
except tf.errors.OutOfRangeError:
print('done')
finally:
coord.request_stop()
coord.join(threads)