有没有办法在现有变量上使用 Pillows“Image.convert()”?

Posted

技术标签:

【中文标题】有没有办法在现有变量上使用 Pillows“Image.convert()”?【英文标题】:Is there a way to use Pillows "Image.convert()" on an existing variable? 【发布时间】:2020-02-19 22:01:00 【问题描述】:

您好,

也许这个问题看起来很愚蠢,但我尝试使用 Pillows Image.convert() 将图像转换为灰度。我已将这张图片存储在变量img 中,因为我已经对其进行了预处理,但没有使用 Pillow(类型:numpy.ndarray)。所以我输入:

img = Image.convert('LA')

但它似乎不起作用,正如它所说:

AttributeError: module 'PIL.Image' has no attribute 'convert'

如果我输入img = Image.open("picture.jpg").convert('LA') 它可以工作,但我想在一个已经存在的变量上使用它。我也不想保存预处理图像只是为了打开并使用前面的命令进行转换,因为这更加低效(在速度和 CPU 功率方面)。 那么:有没有合适的方法来做到这一点?

提前感谢您的帮助!

【问题讨论】:

你试过img = img.convert('LA')吗?您可能需要也可能不需要先使用 img = Image.fromarray(img) 将您的 numpy 数组转换为 PIL 图像 你的 Numpy 数组的形状是什么?转换为灰度后,您打算如何处理图像? @LampToast 是的,我也试过了,但它说“'img' 没有属性'convert'”。所以这也行不通。如果我使用转换img = Image.fromarray(img),它以哪种格式存储?我可以像在 numpy 数组中那样访问单个像素的值吗? img[1][1]? @MarkSetchell 形状为 (35, 64, 3)。所以一张 64x35 的图片有 3 个颜色通道。转换后,我为每个像素排除了一个灰度值,因此它将是 (35, 64, 1) 甚至只是二维的。我需要访问每个单独像素的这些值,例如通过索引(img[0][0] 将是第一个像素) @Totemi1324 如果您使用Image.fromarray(img),它将成为 PIL 图像。灰度转换后,您可以使用 img = np.asarray(img) 简单地转换回 numpy 数组或通过 px = img.load() 获取像素值 【参考方案1】:

而不是说Image.convert() 使用您的图像变量: 例如 img = img.convert('') 在这种情况下:

img = img.convert('LA')

【讨论】:

【参考方案2】:

虽然您可以完美地将 Numpy 数组转换为 PIL 图像,然后将其转换为灰度,然后再转换回 Numpy 数组,如下所示:

PILImage = Image.fromarray(Numpyimg)
PILgrey  = PILImage.convert('L')
Numpygrey= np.array(PILgrey)

您不妨自己进行 ITU-R 601-2 亮度变换,即

L = 0.299 * Red + 0.587 * Green + 0.114 * Blue

所以,你会得到:

Numpygrey = np.dot(Numpyimg[...,:3], [0.299, 0.587, 0.114]).astype(np.uint8)

【讨论】:

【参考方案3】:

你可以使用

img = Image.fromarray(img)

转换为 PIL Image 类型。从那里,您应该可以使用 PIL 的 convert() 函数

img = img.convert('LA')

然后,要直接访问像素值,您可以转换回 numpy 数组

img_array = np.asarray(img)

或使用像素访问 PIL 图像

pixels = img.load()

【讨论】:

以上是关于有没有办法在现有变量上使用 Pillows“Image.convert()”?的主要内容,如果未能解决你的问题,请参考以下文章

cf 760B.Frodo and pillows

有没有办法使用 cloudformation 修改 AWS 现有资源?

有没有办法在 couchdb 现有文档中添加新字段/值

现有对话上的 Lync 2010 SDK 共享应用程序

有没有办法在不覆盖现有类名的情况下将类名添加到 blazor 组件?

有没有办法在不使用 XDocument 的情况下将新的 xml 数据附加到 xml 文件中的现有 xml?