Python模块Mahotas阈值问题

Python模块Mahotas阈值问题,python,threshold,mahotas,Python,Threshold,Mahotas,我正在使用这个教程 但是,当我传递png图像时: T = mahotas.thresholding.otsu(dna) 我得到一个错误: TypeError:mahotas.otsu:此函数仅接受整数类型(传递的数组类型为float32) 有人有这个问题的经验吗?谢谢 错误基本上是说图像数组中元素的类型是32位浮点,而不是整数,这是必需的。文档还指出,此方法需要unsigned int。请参阅 要将numpy数组转换为无符号8位整数,请执行以下操作: # Assuming I is your

我正在使用这个教程

但是,当我传递png图像时:

T = mahotas.thresholding.otsu(dna)
我得到一个错误:

TypeError:mahotas.otsu:此函数仅接受整数类型(传递的数组类型为float32)


有人有这个问题的经验吗?谢谢

错误基本上是说图像数组中元素的类型是32位浮点,而不是整数,这是必需的。文档还指出,此方法需要unsigned int。请参阅

要将numpy数组转换为无符号8位整数,请执行以下操作:

# Assuming I is your image. Convert to 8 bit unsigned integers.
I_uint8 = I.astype('uint8')

更新:请参阅以下Mahotas的创建者对多通道图像问题的评论。

@LightAlchesman的解决方案有效,请记住先将图像乘以255:

img = (img*255).astype('uint8')

我也遵循这个例子。在高斯滤波器之后,dnaf成为浮点64

print(dnaf.dtype)
您需要转换回8位图像

dnaf = dnaf.astype('uint8')
print(dnaf.dtype)
然后继续打阈值

T = mh.thresholding.otsu(dnaf)

mahotas的作者:mahotas的otsu将直接处理多通道图像(otsu仅根据直方图计算)。这对于许多科学用途来说都是有意义的,而且,作为奖励,如果图像是RGB,并且所有通道都具有相同的值,则自动执行正确的操作。@luispedro:谢谢你的评论。你能解释一下,为什么会这样吗?已经有一段时间了,因此,我希望我的答案仍然适用:图像像素通常使用两个概念中的一个来表示:-作为[0.0,1.0]范围内的浮点,其中0.0表示黑色,1.0表示白色,或者-作为[0,255]范围内的整数,0表示黑色,255表示白色OP需要将图像从概念1转换为概念2,因此,像素值应该缩放到255,因此乘法。感谢您的解释,我很感激!