【问题标题】:Scipy.misc.imread flatten argument -- converting to grey scaleScipy.misc.imread flatten 参数——转换为灰度
【发布时间】:2015-08-31 15:22:40
【问题描述】:

我正在尝试了解此方法如何以灰度转换图像(如果它使用简单平均值或加权平均值)——我必须参考此方法。

documentation我知道这个方法调用了convert(‘F’)方法。

从 Pillow/PIL source code,我可以找到这个方法,但是,当 mode 参数设置为“F”时,我找不到它的作用。

谢谢。

【问题讨论】:

    标签: python scipy python-imaging-library pillow


    【解决方案1】:

    Image 对象的convert 方法的文档字符串中(在您链接到的代码中看到),有​​这样的:

    将彩色图像转换为黑白(模式“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)
    

    使用convert 方法中的mode='F' 将数组通过转换为图像并返回到数组发送:

    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)
    

    【讨论】:

    • 您是科学界的天赐之物。 感谢您从基础数据中提取出这种无证转换。没有任何地方说转换为模式F(浮点)概括了转换为模式L(灰度亮度)。转换为模式L强制将结果转换为8位无符号整数,转换为模式F保留此灰度降低的小数部分。这反过来又解释了为什么不推荐使用的scipy.misc.imread() 函数通过转换为模式F 而不是L 来实现flatten 参数。 </phew>
    【解决方案2】:

    模式参数“F”代表“浮点”。

    from PIL import Image
    
    im = Image.new("F", (2,2))
    pixels = im.load()
    pixels[0,0] = 255.0
    pixels[1,0] = 200.0
    pixels[0,1] = 100.0
    pixels[1,1] = 20.0
    im.show()
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2020-04-29
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2010-11-20
      • 2014-03-15
      相关资源
      最近更新 更多