I am going to apply a mean filter on an array of float with window_size=3
for example. I have found this library:
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]]
but this function can't run on float arrays:
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.
How to solve this?
In general (and this is valid for other programming languages), an image can be typically represented in 2 ways:
[0, 255]
. In this case the values are of typeuint8
- unsigned integer 8-bytes.[0, 1]
. In this case the values are of typefloat
.Depending on the language and library, the types and range of values allowed for the pixels' intensity can be more or less permissive.
The error here tells you that the pixels' values of your image (your
array
are of typefloat
but that they are not in the range[-1, 1]
. As the values are in between[0, 255]
, you just need to divide them all by255
. Converting the values to integers may also work.Here is the user-guide of scikit-image explaining the image data-types supported.
Two sentences from this page: