Кто-нибудь знает, что в сохранении Skimage TIfffile, неизвестная ошибка "типа b".? - PullRequest
0 голосов
/ 29 мая 2020

Я получаю странную ошибку при сохранении файла tiff (стек в оттенках серого), есть идеи?:

File "C: \ Users \ ptyimg_np.MT00200169 \ Anaconda3 \ lib \ site- пакеты \ tifffile \ tifffile.py ", строка 1241, в save sampleformat = {'u': 1, 'i': 2, 'f': 3, 'c': 6} [datadtype.kind] KeyError: 'b'

мой код

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
from skimage.morphology import watershed
from skimage.feature import peak_local_max
from scipy import ndimage
from skimage import img_as_float
from skimage import exposure,io 
from skimage import external 
from skimage.color import rgb2gray
from skimage.filters import threshold_local  , threshold_niblack
import numpy as np
import  tifffile 
from joblib import Parallel, delayed 
import sys

# Load an example image
input_namefile = sys.argv[1]
output_namefile = 'seg_'+ input_namefile  

#Settings 
block_size = 25 #Size block of the local thresholding 


img = io.imread(input_namefile, plugin='tifffile') 
thresh =  threshold_niblack(img, window_size=block_size , k=0.8) # 
res = img > thresh
res = np.asanyarray(res)
print("saving segmentation")
tifffile.imsave(output_namefile, res , photometric='minisblack' )

Ответы [ 2 ]

0 голосов
/ 31 мая 2020

Похоже, ошибка вызвана ошибкой при записи логических изображений в вашей установленной версии tifffile. Однако ошибка исправлена ​​в более поздних версиях (в моей текущей среде у меня 2020.2.16). На моей машине это работает нормально:

import numpy as np
import tifffile

tifffile.imsave('test.tiff', np.random.random((10, 10)) > 0.5)

, а строка, вызывающая ошибку sh в вашей версии, никогда не выполняется в случае логического изображения.

Итак, длинная история Короче говоря, используйте python -m pip install -U tifffile для обновления вашей версии tifffile, и ваша программа должна работать!

0 голосов
/ 29 мая 2020

Сначала небольшой анализ. Оскорбительная строка:

sampleformat = {'u': 1, 'i': 2, 'f': 3, 'c': 6}[datadtype.kind]

вызывает исключение KeyError, потому что значение datadtype.kind (тип данных NumPy) установлено на b, а равно no b в этом словаре. Он обслуживает только типы i, u, f и c (соответственно, целое число со знаком, целое число без знака, число с плавающей запятой и сложное число с плавающей запятой). Тип b является логическим.

Похоже на ошибку в коде, который вы используете. Если это что-то не поддерживается, код действительно должен перехватывать исключение и сообщать о нем более удобным для пользователя способом, а не просто сбрасывать исключение, чтобы вы могли его понять.

Мой совет - поднять это как ошибка с автором.


С точки зрения root причины проблемы (это предположение, основанное на анализе, поэтому могу ошибаться, я просто предоставляю это как возможная причина), анализ вашего кода показывает:

img = io.imread(input_namefile, plugin='tifffile') 
thresh =  threshold_niblack(img, window_size=block_size , k=0.8) # 
res = img > thresh
res = np.asanyarray(res)
tifffile.imsave(output_namefile, res , photometric='minisblack' )

Третья строка выше установит res либо в логическое значение, либо в логический массив, который зависит на соответствующие значения каждого пикселя в img и thresh (я не знаю достаточно о NumPy, чтобы говорить об этом).

Однако, независимо от этого, они являются одним или несколькими booleans поэтому, когда вы пытаетесь записать их с помощью вызова imsave(), он жалуется на используемый тип (как упоминалось выше, похоже, он не поддерживает логические значения правильно).

На основе некоторого образца код, найденный в другом месте:

image = data.coins()
mask = image > 128
masked_image = image * mask

Я подозреваю, что вам следует использовать что-то похожее на эту последнюю строку, чтобы применить маску к изображению, а затем записать результирующее значение:

img = io.imread(input_namefile, plugin='tifffile') 
thresh =  threshold_niblack(img, window_size=block_size , k=0.8)

mask = image > 128  # <-- unsure if this is needed.
res = img * thresh  # <-- add this line.

res = np.asanyarray(res)
tifffile.imsave(output_namefile, res , photometric='minisblack' )

Применение маски к исходному изображению должно дать вам массив полезных значений, которые вы можете записать обратно в файл изображения. Обратите внимание, что я не уверен, нужна ли вам строка res > thresh, поскольку мне кажется, что порог уже дает вам маску. Я мог ошибаться в этом пункте, поэтому я советую обсудить это с автором.

...