【问题标题】:Why skimage mean filter does not work on float array?为什么 skimage 均值滤波器不适用于浮点数组?
【发布时间】:2018-01-22 00:19:17
【问题描述】:

例如,我将在带有 window_size=3 的浮点数组上应用均值滤波器。我找到了这个库:

from skimage.filters.rank import mean
import numpy as np

x=np.array([[1,8,10],
           [5,2,9],
           [7,2,9],
           [4,7,10],
           [6,14,10]])

print(x)
print(mean(x, square(3)))


[[ 1  8 10]
 [ 5  2  9]
 [ 7  2  9]
 [ 4  7 10]
 [ 6 14 10]]
[[ 4  5  7]
 [ 4  5  6]
 [ 4  6  6]
 [ 6  7  8]
 [ 7  8 10]]

但是这个函数不能在浮点数组上运行:

from skimage.filters.rank import mean
import numpy as np

x=np.array([[1,8,10],
           [5,2,9],
           [7,2,9],
           [4,7,10],
           [6,14,10]])

print(x)
print(mean(x.astype(float), square(3)))

File "/home/pd/RSEnv/lib/python3.5/site-packages/skimage/util/dtype.py", line 236, in convert
raise ValueError("Images of type float must be between -1 and 1.")
    ValueError: Images of type float must be between -1 and 1.

如何解决?

【问题讨论】:

    标签: python filtering mean scikit-image


    【解决方案1】:

    一般来说(这对其他编程语言也有效),图像通常可以用两种方式表示:

    • 强度值在[0, 255] 范围内。在这种情况下,值的类型为 uint8 - 无符号整数 8 字节。
    • 强度值在[0, 1] 范围内。在这种情况下,值的类型为 float

    根据语言和库,像素强度允许的值的类型和范围可能或多或少是允许的。

    这里的错误告诉您图像的像素值(您的array 的类型为float,但它们不在[-1, 1] 范围内。由于值介于[0, 255] 之间,您只需将它们全部除以255。将值转换为整数也可以。

    Here 是 scikit-image 的用户指南,解释了支持的图像数据类型。

    本页的两句话:

    • 请注意,浮动图像应限制在 -1 到 1 的范围内,即使数据类型本身可以超出此范围
    • 你不应该在图像上使用 astype,因为它违反了这些关于 dtype 范围的假设

    【讨论】:

      猜你喜欢
      • 2019-09-05
      • 2016-07-15
      • 2021-01-05
      • 2018-03-19
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多