为什么这样做?
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
答案 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')