В строке документации метода convert
объекта Image
(видно в коде, на который вы ссылаетесь) есть следующее:
При переводе цветного изображения в черно-белое (режим "L") библиотека использует преобразование яркости ITU-R 601-2:
L = R * 299/1000 + G * 587/1000 + B * 114/1000
По-видимому, так же обрабатывается mode='F'
.
Вот пример:
In [2]: from PIL import Image
Создайте массив для демонстрации:
In [3]: x = np.random.randint(0, 9, size=(4, 4, 3)).astype(np.uint8)
Отправьте массив через преобразование в изображение и обратно в массив, используя mode='F'
в методе convert
:
In [4]: np.array(Image.fromarray(x).convert('F'))
Out[4]:
array([[ 3.24499989, 6.30499983, 1.86899996, 4.54400015],
[ 3.54399991, 5.04300022, 4.63000011, 0.29899999],
[ 2.0539999 , 3.29900002, 1.85800004, 1.76100004],
[ 3.9289999 , 4.76100016, 5.76100016, 2.47799993]], dtype=float32)
Умножьте x
на коэффициенты, указанные в строке документации convert
:
In [5]: f = np.array([0.299, 0.587, 0.114])
In [6]: x.dot(f)
Out[6]:
array([[ 3.245, 6.305, 1.869, 4.544],
[ 3.544, 5.043, 4.63 , 0.299],
[ 2.054, 3.299, 1.858, 1.761],
[ 3.929, 4.761, 5.761, 2.478]])
Если мы конвертируем в np.float32
, мы видим точно такие же значения, как созданные методом convert
:
In [7]: x.dot(f).astype(np.float32)
Out[7]:
array([[ 3.24499989, 6.30499983, 1.86899996, 4.54400015],
[ 3.54399991, 5.04300022, 4.63000011, 0.29899999],
[ 2.0539999 , 3.29900002, 1.85800004, 1.76100004],
[ 3.9289999 , 4.76100016, 5.76100016, 2.47799993]], dtype=float32)
31.08.2015
F
(с плавающей запятой) обобщает преобразование в режимL
(яркость в оттенках серого). В то время как преобразование в режимL
приводит результаты к 8-битным целым числам без знака, преобразование в режимF
сохраняет дробную часть этого сокращения оттенков серого. Это, в свою очередь, теперь объясняет, почему устаревшая функцияscipy.misc.imread()
реализует параметрflatten
путем преобразования в режимF
, а неL
.</phew>
21.11.2017