PIL是否可以与skimage一起使用?

时间:2018-06-29 16:35:51

标签: python-3.x image-processing pillow scikit-image

为什么这样做?

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

1 个答案:

答案 0 :(得分:1)

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

edges = feature.canny(blimage)

>>> print(edges.dtype)
bool

这是一个布尔型图像,True表示白色,False表示黑色。 PIL可以正确识别数据类型,并尝试将其映射到自己的1位模式,该模式为 "1" (请参见PIL docs about it)。 不过,这看起来很糟糕,似乎无法正确获取字节宽度或类似的内容。

有一个issue about it,他们似乎已经将PIL转换为NumPy,但显然相反仍然无效。

总而言之,长话短说,成功将二进制图像从NumPy转换为PIL的最佳选择就是将其转换为灰度:

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

>>> print edges_pil.mode
L

如果您实际上需要1位图像,则可以随后使用

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