【问题标题】:Python image conversion [closed]Python图像转换[关闭]
【发布时间】:2015-11-21 03:53:56
【问题描述】:

我正在尝试将具有模式 I(32 位有符号整数像素)的图像转换为标准灰度或“RGB”图像。问题是当我尝试转换它时,它只是变成一个空白的白色图像。我正在使用 PIL 模块。

这是我要转换的图像。

from PIL import Image
sample_img = Image.open('sample.png') 
sample_img=sample_img.convert('L')

【问题讨论】:

  • 你能显示你的非工作代码吗?
  • 也许this link 会有所帮助。它处理类似的问题,但使用的是 16 位灰度 PNG。
  • @Yuriko 这也是一个 16 位灰度 PNG,这个问题可能应该作为副本关闭。另一个问题的正确答案潜伏在 cmets 中:将 point 函数与适当的表一起使用。 sample_img = sample_img.point([i//256 for i in range(0x10000)], 'L')

标签: python image python-imaging-library


【解决方案1】:

这对你有用吗?

from PIL import Image
import numpy as np

sample_img = Image.open('sample.png') 
rescaled = 255 * np.asarray(sample_img)/2**16
img = Image.fromarray(np.uint8(rescaled))

这给出了:

>>> np.asarray(img)

array([[ 95,  96,  98, ...,  98, 105, 107],
       [ 93,  97,  99, ..., 100, 105, 108],
       [ 94,  99, 100, ..., 102, 105, 110],
       ..., 
       [130, 125, 125, ...,  97,  98, 100],
       [128, 120, 123, ...,  99,  99, 101],
       [125, 119, 120, ..., 101, 100, 101]], dtype=uint8)

这是一个“标准”的 8 位灰度图像。

【讨论】:

    【解决方案2】:

    PIL 是我曾经尝试依赖的漏洞最多的软件包之一。这是一个非常直接的转换,您提供的示例代码应该可以正常工作。

    这是一个解决方法。

    def ItoL(im):
        w, h = im.size
        result = Image.new('L', (w, h))
        pix1 = im.load()
        pix2 = result.load()
        for y in range(h):
            for x in range(w):
                pix2[x,y] = pix1[x,y] >> 8
    return result
    

    【讨论】:

    • 这两种解决方案都有效,但我发现另一种更适合我的代码。
    猜你喜欢
    • 2015-03-06
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2011-03-02
    • 2010-11-01
    • 2012-06-26
    • 2018-07-26
    相关资源
    最近更新 更多