skimage.io.imread ведет себя по-разному при указании строки или пути - PullRequest
0 голосов
/ 04 октября 2019

Я только что наткнулся на странную ситуацию с skimage.io.imread.

Я пытался открыть MultiPage TIFF (размеры: 96x512x512), например:

import argparse
from pathlib import Path
import numpy as np
from skimage import io

def numpy_array_from_file(path):
    """ method to load numpy array from tiff file"""
    im_data = io.imread(path)
    print ("image dimensions {}".format(im_data.shape))
    return im_data

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Extract page from a MultiPage TIFF")
    parser.add_argument("tiff_file", type=str, help="3D TIFF file to open)")
    args = parser.parse_args()

    tiff_file = Path(args.tiff_file).absolute()
    numpy_array_from_file(tiff_file)

И я получалв выводе:

image dimensions (512, 512)

Попробовав много разных вещей (поскольку я был уверен, что мое входное изображение содержало 96 страниц), я обнаружил, что проблема заключается в прямом использовании Path в numpy_array_from_file вместоиспользования строки. Изменив последнюю строку на:

    numpy_array_from_file(str(tiff_file))

Я получил ожидаемое:

image dimensions (96, 512, 512)

Итак, мой вопрос ... Кто-нибудь знает, почему у меня такое поведение? Я не очень опытный в Python, но я ожидал получить ошибку, если Path не подходит в этой ситуации.

1 Ответ

1 голос
/ 05 октября 2019

Действительно, pathlib.Path является относительно новым, поэтому поддержка в scikit-image, как правило, неоднородна. Происходит следующее: поскольку Path не является строкой, расширение не проверяется, и вместо tifffile используется imageio. Поведение imread отличается для двух библиотек: imageio предпочитает возвращать только одну плоскость.

Это известная проблема в нашем трекере проблем . Пока это не исправлено, вы можете использовать str() или явно вызывать plugin='tifffile'.

...