【问题标题】:Why does the Sobel filter return a black square?为什么 Sobel 过滤器返回一个黑色方块?
【发布时间】:2021-06-19 19:22:55
【问题描述】:

我正在尝试使用来自skimagesobelprewitt 过滤器进行边缘检测来比较结果,但是对于这两个我都只得到黑色方块!

这是我的代码:

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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      相关资源
      最近更新 更多