【问题标题】:Does PIL work with skimage?PIL 是否适用于 skimage?
【发布时间】:2018-06-29 16:35:50
【问题描述】:

为什么当我这样做时:

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 返回的类型,并在 fromarray 的参数中选择相应的模式,以确保没有基于类型的错误(很可能)。

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


【解决方案1】:

让我们看看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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2020-06-04
    • 2014-06-28
    • 2013-09-26
    • 1970-01-01
    • 2013-11-10
    • 2015-07-13
    相关资源
    最近更新 更多