<p>在<code>Image</code>对象的<code>convert</code>方法的docstring中(可以在链接到的代码中看到),有以下内容:</p>
<blockquote>
<p>When translating a color image to black and white (mode "L"),
the library uses the ITU-R 601-2 luma transform::</p>
<p>L = R * 299/1000 + G * 587/1000 + B * 114/1000</p>
</blockquote>
<p>显然这也是<code>mode='F'</code>的处理方式。在</p>
<p>下面是一个例子:</p>
<pre><code>In [2]: from PIL import Image
</code></pre>
<p>为演示创建数组:</p>
^{pr2}$
<p>使用<code>convert</code>方法中的<code>mode='F'</code>将数组通过转换发送到图像并返回到数组:</p>
<pre><code>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)
</code></pre>
<p>将<code>x</code>乘以<code>convert</code>的docstring中显示的因子:</p>
<pre><code>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]])
</code></pre>
<p>如果我们转换为<code>np.float32</code>,我们看到的值与<code>convert</code>方法创建的值完全相同:</p>
<pre><code>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)
</code></pre>