为什么skimage意味着过滤器在浮点数组上不起作用?

时间:2017-08-14 07:51:06

标签: python filtering mean scikit-image

我将在window_size=3的float数组上应用均值过滤器。我找到了这个库:

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]]

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

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.

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

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

根据语言和库的不同,像素强度所允许的值的类型和范围可以或多或少地允许。

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

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

本页的两句话:

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