Python 为什么Sobel过滤器返回黑色正方形?

Python 为什么Sobel过滤器返回黑色正方形?,python,image-processing,python-imaging-library,scikit-image,sobel,Python,Image Processing,Python Imaging Library,Scikit Image,Sobel,我试图使用sobel和prewitt过滤器从skimage进行边缘检测,以比较结果,但对于这两种方法,我只得到了黑色方块 这是我的密码: 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

我试图使用
sobel
prewitt
过滤器从
skimage
进行边缘检测,以比较结果,但对于这两种方法,我只得到了黑色方块

这是我的密码:

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
的大多数方法一样,该函数使用
np.float64
进行计算,从而将图像适当地转换为
0.0。。。1.0
。接下来,您的结果
b
也是类型
np.float64
,其值在相同范围内。现在转换到某个枕形
图像
对象时,其设置为
F
,用于32位浮点像素

现在,这个例子告诉我们:

在Windows上,使用标准PNG显示实用程序打开图像

目前尚不清楚图像实际显示的文件格式(?)。看起来,至少根据临时文件名,它是PNG。但是,例如,使用模式
F
将一些
图像
对象保存为PNG或JPG不起作用!因此,看起来,图像必须以某种方式转换以使其可显示。第一个猜测是,一些常规的8位图像被选为默认图像,因为您得到的图像几乎全是黑色的,这表明值
0
和可能
1
被视为“非常暗”。事实上,当使用

b=Image.fromarray(b*255)
使用
b.show()
时,Windows图像预览将显示正确的图像

因此,这将是显示的一个解决方法

然而,如果您想保存图像,则不必进行转换,只需使用适当的文件格式来存储这些32位信息,例如TIFF:

b=Image.fromarray(b)
b、 保存('b.tiff')

与来自
scikit image
的大多数方法一样,该函数使用
np.float64
进行计算,从而将图像适当地转换为
0.0。。。1.0
。接下来,您的结果
b
也是类型
np.float64
,其值在相同范围内。现在转换到某个枕形
图像
对象时,其设置为
F
,用于32位浮点像素

现在,这个例子告诉我们:

在Windows上,使用标准PNG显示实用程序打开图像

目前尚不清楚图像实际显示的文件格式(?)。看起来,至少根据临时文件名,它是PNG。但是,例如,使用模式
F
将一些
图像
对象保存为PNG或JPG不起作用!因此,看起来,图像必须以某种方式转换以使其可显示。第一个猜测是,一些常规的8位图像被选为默认图像,因为您得到的图像几乎全是黑色的,这表明值
0
和可能
1
被视为“非常暗”。事实上,当使用

b=Image.fromarray(b*255)
使用
b.show()
时,Windows图像预览将显示正确的图像

因此,这将是显示的一个解决方法

然而,如果您想保存图像,则不必进行转换,只需使用适当的文件格式来存储这些32位信息,例如TIFF:

b=Image.fromarray(b)
b、 保存('b.tiff')