【问题标题】:Why does the Sobel filter return a black square?为什么 Sobel 过滤器返回一个黑色方块?
【发布时间】:2021-06-19 19:22:55
【问题描述】:
我正在尝试使用来自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()
【问题讨论】:
标签:
python
image-processing
python-imaging-library
scikit-image
sobel
【解决方案1】:
与scikit-image 中的大多数方法一样,sobel 函数使用np.float64 进行计算,从而将您的图像适当地转换为0.0 ... 1.0 范围。接下来,您的结果 b 也是 np.float64 类型,其值在同一范围内。现在转换为某个 Pillow Image 对象时,其mode 设置为F,用于32 位浮点像素。
现在,documentation on Image.show 告诉我们,例如:
在 Windows 上,使用标准 PNG 显示实用程序打开图像。
目前尚不清楚,图像实际以哪种文件格式(?)显示。看起来,它是PNG,至少根据临时文件名。但是,例如,将一些 Image 对象与模式 F 保存为 PNG 或 JPG 是行不通的!因此,似乎必须以某种方式转换图像以使其可显示。第一个猜测是,默认选择了一些常规的 8 位图像,因为你得到了几乎全黑的图像,这表明值 0 和可能 1 被视为“非常暗”。而且,事实上,当使用类似的东西时
b=Image.fromarray(b * 255)
使用b.show() 时,Windows 图像预览会显示正确的图像。
所以,这将是显示的一种解决方法。
不过,如果您想保存图像,则不一定需要进行转换,只需要使用适当的文件格式来存储这些 32 位信息,例如 TIFF :
b=Image.fromarray(b)
b.save('b.tiff')