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,他们似乎已经修复了 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')
为什么会这样:
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,他们似乎已经修复了 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')