Сначала небольшой анализ. Оскорбительная строка:
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
, поскольку мне кажется, что порог уже дает вам маску. Я мог ошибаться в этом пункте, поэтому я советую обсудить это с автором.