plt.imread (img) поднимает PIL.UnidentifiedImageError - PullRequest
1 голос
/ 12 марта 2020

Поэтому, когда я пытаюсь использовать imread для TIFF-файла, возникает эта ошибка.

Рассматриваемый TIFF-файл - это TIFF, который я создал и изменил в другом скрипте. Я изначально создал это так: temp = np.full([max_y, max_x], np.nan). Затем я зациклил ячейки и изменил значения ячейки. Впоследствии я использовал cv2.imwrite, чтобы записать его в файл.

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

Я также могу открыть файл в QGIS, поэтому не знаю, в чем проблема.

РЕДАКТИРОВАТЬ: это изображение https://drive.google.com/file/d/1CjAGegeA9RUmTtgd_8xgrRPqOLx8NdMa/view?usp=sharing

Соответствующую часть кода вы можете найти здесь: https://codeshare.io/5oYNDo. Ошибка возникает в строке 32.

РЕДАКТИРОВАТЬ 2: С помощью Марка я преобразовал ее в 32-битное изображение: https://drive.google.com/file/d/1xDyqeEzMrB-84ms9BB7YztbT-_kfJpeG/view?usp=sharing. Однако plt.imread все еще не работал. Так что теперь я использую img_arr = np.asarray(Image.open(img)). Однако это приводит к странной ошибке: массив полон NaN, но когда я наводю курсор мыши на изображение, я получаю значение ячейки. (https://imgur.com/a/jbppYuO) Из-за того, что массив, заполненный NaN, vmin и vmax не работают должным образом, поэтому вся картинка желтого цвета. Если я удаляю vmin и vmax, он визуализируется как следует. Но массив, заполненный NaN, приведет к дальнейшим проблемам в скрипте, поэтому сначала нужно решить эту проблему.

1 Ответ

1 голос
/ 12 марта 2020

Ваше изображение представляет собой 64-битный TIFF с плавающей запятой. Вы можете видеть это с:

tiffinfo v3l1_24-34.tiff

Или с ImageMagick :

magick identify -verbose v3l1_24-34.tiff

PIL не нравятся такие вещи , так что вы либо нужно либо создать его как 32-битный:

temp = np.full(..., dtype=np.float32)

, либо, если вам нужно 64-битный, возможно, прочитайте его с помощью tifffile:

import tifffile
...
im = tiffffile.imread('v3l1_24-34.tiff')

Если у вас есть несколько уже существующих файлов BigTIFF, которые вы хотите превратить в 32-битные файлы classi c TIFF, вы можете попробовать следующие команды:

# Use an ImageMagick version with Q16 or higher and HDRI when you run "identify -version"
magick input.tif -define quantum:format=floating-point -depth 32 output.tif

# Or use "libvips" in the Terminal
vips im_vips2tiff input.tif output.tif

Чтобы проверить, является ли файл BigTIFF или нет, используйте exiftool и ищите BTF следующим образом:

exiftool bigtiff.tif 
ExifTool Version Number         : 11.11
File Name                       : bigtiff.tif
Directory                       : .
File Size                       : 1024 kB
File Modification Date/Time     : 2020:03:13 13:56:05+00:00
File Access Date/Time           : 2020:03:13 13:56:19+00:00
File Inode Change Date/Time     : 2020:03:13 13:56:11+00:00
File Permissions                : rw-r--r--
File Type                       : BTF           <--- HERE
...
...

Или используйте xxd вот так и ищите 3-й байт 0x2b:

xxd bigtiff.tif | more
00000000: 4949 2b00 0800 0000 1000 1000 0000 0000  II+.............
...
...

тогда как ClassicTIFF отображается как 0x2a:

xxd classic.tiff | more
00000000: 4949 2a00 0800 1000 0000 803f 0000 803f  II*........?...?
...