PIL 是否适用于 skimage?

Does PIL work with skimage?

为什么会这样:

from skimage import feature, io
from PIL import Image

edges = feature.canny(blimage)
io.imshow(edges)
io.show()

我得到了我想要的,即全边图像。但是当我这样做时:

edges = feature.canny(blimage)
edges = Image.fromarray(edges)
edges.show()

我得到了一堆乱七八糟的随机点、线和其他东西,它们比图像更像杰克逊·波洛克的画作?怎么了,我该如何解决才能通过这两种方法获得我想要的东西?

如需完整代码,请访问我的 Github 此处:

https://github.com/Speedyflames/Image-Functions/blob/master/Image_Processing.py

让我们看看skimage.feature.canny生成了什么样的图像:

edges = feature.canny(blimage)

>>> print(edges.dtype)
bool

这是一个布尔图像,True 代表白色,False 代表黑色。 PIL 正确识别数据类型并尝试将其映射到它自己的 1 位模式,即 "1"(参见 PIL docs about it)。 虽然这看起来很糟糕,但它似乎没有正确获得字节宽度或类似的东西。

有一个 issue about it,他们似乎已经修复了 PILNumPy 的转换,但显然反过来仍然是错误的。

无论如何,长话短说,将二进制图像从 NumPy 成功转换为 PIL 的最佳方法是将其转换为灰度:

edges_pil = Image.fromarray((edges * 255).astype(np.uint8))

>>> print edges_pil.mode
L

如果您确实需要 1 位图像,您可以在之后使用

进行转换
edges_pil = edges_pil.convert('1')