为什么 Sobel 过滤 return 黑色方块?

Why does the Sobel filter return a black square?

我正在尝试使用 skimage 中的 sobelprewitt 过滤器进行边缘检测以比较结果,但对于两者我都只得到黑色方块!

这是我的代码:

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 function uses np.float64 for calculations, and thus converts your image appropriately to the range 0.0 ... 1.0. Following, your result b is also of type np.float64 with values in the same range. When now converting to some Pillow Image object, its mode设置为F,用于32位浮点像素 .

现在,documentation on Image.show 告诉我们,例如:

On Windows, the image is opened with the standard PNG display utility.

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

这样的东西时
b=Image.fromarray(b * 255)

Windows 图像预览在使用 b.show() 时显示正确的图像。

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

尽管如此,如果您想 保存 图像,则不一定需要转换,而只需要使用适当的文件格式来存储这些 32 位信息,例如 TIFF:

b=Image.fromarray(b)
b.save('b.tiff')