有没有办法在现有变量上使用 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()”?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 cloudformation 修改 AWS 现有资源?