#image-processing #computer-vision #tensorflow2.0
Вопрос:
У меня есть много изображений, которые поворачиваются на 90 градусов, когда я использую Tensorflow tf.image.decode_jpeg() для чтения изображений в моем конвейере данных. Когда я смотрю на эти изображения на своем компьютере, они выглядят правильно ориентированными, и когда я читаю изображение с помощью cv2, они также выглядят правильно ориентированными. Однако, когда я читаю их с помощью Tensorflow tf.image.decode_jpeg(), они поворачиваются на 90 градусов. Кто-нибудь знает, почему или как я могу исправить это, чтобы они читали в правильной ориентации (это происходит не со всеми изображениями, но со многими)?
Чтобы показать, что я имею в виду, вот как выглядит образец изображения на моем компьютере или когда я читаю его с открытым резюме.
Однако, когда я читаю его с помощью Tensorflow (tensorflow 2.4.0) в своем конвейере, многие изображения поворачиваются на 90 градусов, и, например, одно и то же изображение выглядит примерно так.
Чтобы прочитать и увидеть изображение с помощью cv2, я делаю
import cv2
import matplotlib.pyplot as plt
import tensorflow as tf
%matplotlib inline
plt.imshow(cv2.imread(image_file_path)[:, :, ::-1]))
Для чтения и просмотра многих повернутых изображений с помощью Tensorflow
def decode_images(dataset_file_paths):
'''
tf_read_converted_file_path = tf.io.read_file(dataset_file_paths)
return tf.image.decode_jpeg(tf_read_converted_file_path)
def check_processed_images(files_path_dataset, processing_function):
'''Plots images to see what the processing looks like when it is mapped in from a dataset.
This can be used to, for example, look see how the augmentation of images look.
Arguments:
files_path_dataset: TF TensorSliceDataset of filenames.
processing_function: function which is used to map each element in the dataset.
Return:
plot of images'''
augmentation_dataset = files_path_dataset.map(processing_function).shuffle(50).batch(16)
plt.figure(figsize=(13, 13))
for images, labels in augmentation_dataset.take(1):
for i in range(16):
ax = plt.subplot(4, 4, i 1)
plt.imshow(images[i].numpy())
####################
####################
# Look at a sample of images
# Take a directory of jpg images and create a TensorFlow dataset of filepaths
dirPath = type_in_a_directory_here
fileNames = tf.io.gfile.glob(f'{dirPath}/**/*.jpg')
fileNames = tf.random.shuffle(fileNames)
filenamesDs = tf.data.Dataset.from_tensor_slices(fileNames)
check_processed_images(filenamesDs, decode_images)
Приведенный выше код создаст сетку изображений, чтобы вы могли видеть. Например, все эти изображения на моем компьютере имеют рыболовную приманку, так что они горизонтальны, но когда я использую TensorFlow для обработки своих изображений, многие из них по какой-то причине поворачиваются на 90 градусов.
Я делаю что-то не так, что Tensorflow вращает многие из моих изображений?
Ответ №1:
Это не вращение изображения, это pyplot, который представляет изображения в формате [W, H, D]
(Ширина, высота, глубина), в то время как TensorFlow и OpenCV используют формат [H,W,D]
.
Если вы хотите визуализировать изображение без поворота с помощью pyplot, вам следует перенести его с помощью tf.transpose
Ответ №2:
решенный: Я выяснил, в чем проблема. Все изображения расположены правильно при просмотре их в виде миниатюр и при открытии их с помощью программы «Предварительный просмотр» на моем Mac. Однако, когда я смотрю на фактические размеры изображений в соответствии с их свойствами, многие из них на самом деле должны выглядеть повернутыми на 90 градусов. Я понятия не имею, почему это происходит, но, насколько я понимаю, проблема была обнаружена.