我正试图使用skimage
中的sobel
和prewitt
滤波器进行边缘检测,以比较结果,但对于这两种滤波器,我只得到黑色方块!
这是我的代码:
import numpy as np
from skimage import filters
from PIL import Image
a=Image.open('F:/CT1.png').convert('L')
a.show()
a=np.asarray(a)
b=filters.sobel(a)
b=Image.fromarray(b)
b.show()
与scikit-image
中的大多数方法一样,sobel
函数使用np.float64
进行计算,从而将图像适当地转换为范围0.0 ... 1.0
。下面,您的结果b
也是具有相同范围内的值的np.float64
类型。现在转换为某个PillowImage
对象时,其模式设置为F
,用于32位浮点像素。
现在,Image.show
上的文档告诉我们,例如:
在Windows上,使用标准PNG显示实用程序打开图像。
图像实际显示的文件格式(?(尚不清楚。看起来,它是PNG,至少根据临时文件名。但是,例如,将一些模式为F
的Image
对象保存为PNG或JPG是不起作用的!所以,看起来,图像必须以某种方式转换才能显示。第一种猜测是,选择一些常规的8位图像作为默认图像,因为你得到了一个几乎全黑的图像,这表明值0
和1
被视为"0";非常黑";。事实上,当使用这样的东西时
b=Image.fromarray(b * 255)
当使用CCD_ 17时,Windows图像预览显示适当的图像。
因此,这将是显示的一个变通方法。
尽管如此,如果您想保存图像,您不一定需要转换,只需要使用适当的文件格式来存储这些32位信息,例如TIFF:
b=Image.fromarray(b)
b.save('b.tiff')