Почему я не могу просмотреть изображения в формате TIFF с помощью Jupyter? И почему я не могу сделать видео из этих изображений TIFF?

У меня есть файл с большим количеством изображений .tif.

Часть 1. Предварительный просмотр изображений TIFF

Когда я пытаюсь предварительно просмотреть их, щелкнув их в папке jupyter (которая выглядит так: Jupyter папку), я получаю следующее сообщение:

Ошибка ! D:...\image.tif не в кодировке UTF-8

Напротив, если я нажму на png в папке Jupyter, Jupyter отобразит изображение.

Как я могу исправить свои изображения, зная, что в моей папке их более 1000?

Тем не менее, если я напишу:

sph = cv2.imread('A1.tif',-1)
plt.imshow(sph)
plt.show()

Я получаю изображение: изображение "A1.tif".

Сейчас еще проверил:

import chardet
chardet.detect('A1.det')
--> {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}  # result

Так что, видимо, я закодирован в ascii. Это то же самое, что и utf-8, или я должен их преобразовать?

Редактировать: Ответ: В одном из комментариев @FabienP отвечает, что «Согласно официальной документации, лаборатория Jupyter не поддерживает формат TIFF для предварительного просмотра изображений (на данный момент)», что отвечает на этот вопрос.

Часть 2: написание видео из изображений TIFF

У меня есть еще один вопрос, и я не знаю, связаны ли оба вопроса.

Я хочу сделать из них видео.

import cv2
import os
image_folder = 'A549_A1'
video_name = 'video.avi'

images = [img for img in os.listdir(image_folder) if img.endswith(".tif")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

video = cv2.VideoWriter(video_name, 0, 1, (width,height))

for image in images:
     video.write(cv2.imread(os.path.join(image_folder, image)))

cv2.destroyAllWindows()
video.release()

Но вместо ожидаемого видео я получаю странное видео со множеством изображений за один шаг: caption of видео. Вы можете сравнить его с изображением выше, чтобы убедиться, что это не нормально.

Как я могу это исправить?


person JosephAc    schedule 26.02.2019    source источник
comment
Это очень запутанно. UTF-8 — это кодировка текста; нет абсолютно никакого смысла требовать его для данных, которые вообще не являются текстом.   -  person tripleee    schedule 26.02.2019
comment
Если вы покажете свой код, как того требует минимальный, полный, проверяемый пример, вы, скорее всего, получите ответ stackoverflow.com/help/mcve   -  person Mark Setchell    schedule 26.02.2019
comment
@tripleee Вы имеете в виду, что мой вопрос запутан или сообщение об ошибке запутано?   -  person JosephAc    schedule 27.02.2019
comment
С вашими изображениями все в порядке - я полагаю, вы можете видеть их в обычном проводнике Windows (Мой компьютер)? Они не должны быть UTF-8. Ни ASCII. И не расшифрован. Ни закодировано. Может быть, сделать шаг назад и сказать, чего вы пытаетесь достичь здесь...   -  person Mark Setchell    schedule 27.02.2019
comment
Согласно официальной документации, лаборатория Jupyter не поддерживает формат TIFF. для предварительного просмотра изображения (на данный момент).   -  person FabienP    schedule 27.02.2019
comment
Если, как было предложено, файлы TIFF не поддерживаются, вы можете использовать ImageMagick для создания PNG-версий всех ваших файлов TIFF с помощью этой команды в Командной строке magick mogrify -format PNG *.tif Однако, если вы действительно хотите чтобы прочитать их с помощью OpenCV, в этом нет необходимости, потому что он все равно понимает TIFF.   -  person Mark Setchell    schedule 27.02.2019
comment
@MarkSetchell Спасибо за ваши ответы. То, что вы говорите о cv2, наполовину правильно, поскольку есть проблема с cv2.VideoWriter . Кроме того, есть ли возможность написать команду, которая конвертирует все эти файлы TIFF в PNG? Потому что конвертировать их все по одному довольно долго.   -  person JosephAc    schedule 27.02.2019
comment
Лично я бы рассматривал использование ffmpeg... stackoverflow.com/a/24966617/2836621   -  person Mark Setchell    schedule 27.02.2019
comment
Предложенная мной команда ImageMagick создаст PNG-версии всех ваших файлов TIFF с помощью одной единственной команды.   -  person Mark Setchell    schedule 27.02.2019
comment
@MarkSetchell Отлично, я посмотрю на ffmpeg. Что касается ImageMagick, где мне ввести путь в команде?   -  person JosephAc    schedule 27.02.2019
comment
Команда предполагает, что вы использовали CD для изменения каталога на каталог, содержащий ваши изображения.   -  person Mark Setchell    schedule 27.02.2019
comment
В документации CV2 указано, что cv2.VideoWriter в любом случае будет запускать ffmpeg (или Linux и, возможно, Windows) за кулисами.   -  person tripleee    schedule 27.02.2019


Ответы (1)


Преобразование байтов изображения из ASCII в UTF-8 имеет лишь немногим больший смысл, чем преобразование их из градусов Фаренгейта в градусы Цельсия или преобразование их в B ♭ мажор. Если вы сможете найти способ сделать это технически, все, что он сделает, — это испортит изображение. На самом деле, это полностью отвлекающий маневр и не имеет абсолютно никакого отношения к вашей проблеме с преобразованием видео.

Текстовые кодировки, такие как ASCII и UTF-8, описывают, как символы сопоставляются между кодовыми точками или глифами и компьютерными представлениями. В файле изображения нет текста; это просто набор пикселей. Может быть, см. также основополагающее сообщение в блоге 2003 г. -unicode-and-character-sets-no-excuses/" rel="nofollow noreferrer">Абсолютный минимум, который каждый разработчик ПО обязательно должен знать о Unicode и наборах символов (без оправданий!)< /а>

Более того, поскольку UTF-8 совместим с ASCII, каждый файл ASCII уже тривиально является файлом UTF-8. Нет никакого преобразования, которое вы можете применить, чтобы сделать его «более UTF-8».

С другой стороны, двоичные форматы обычно имеют совершенно другую внутреннюю структуру. Просто для изображения тривиальный формат может просто кодировать каждый черный пиксель как 1 бит, а каждый белый пиксель как 0 бит. (На самом деле самая первая версия TIFF делала именно это, с некоторыми дополнительными излишествами. ) Вы можете добавить константу, например, к каждому байту, но это просто превратит его в беспорядок, который больше не будет содержать действительного изображения. Изучите, что произойдет, если вы добавите единицу к числу, например 63, которое имеет много битов 1 в младшей половине в его двоичном представлении:

 63    0011 1111      ..XX XXXX  <- sequence of black pixels
+ 1  + 0000 0001      .... ...X
---- -----------     ----------
 64    0100 0000      .X.. ....  <- one black pixel, lots of white

Современные двоичные форматы немного сложнее и часто содержат последовательности заголовков, которые указывают, сколько байтов данных следует за ними или где искать конкретную функцию для заполнения структуры данных в памяти. Замена этих значений другими значениями почти наверняка создаст поток, который будет просто поврежден, если только вы точно не знаете, что делаете.


Сравнивая с https://stackoverflow.com/a/34555939/874188 и немного погуглив, можно предположить, что передача 0 в качестве fourcc может быть источником ваших проблем.

person tripleee    schedule 27.02.2019
comment
stackoverflow.com/a/31401095/874188 предлагает cv2.VideoWriter_fourcc(list("MJPG")), хотя в другом ответе на тот же вопрос утверждается, что раньше он работал плохо в какой-то момент, и есть много других вариантов, которые вы могли бы попробовать. - person tripleee; 27.02.2019