如何使用PIL的im.point()查找和修改像素的RGB颜色?

时间:2014-02-19 21:31:16

标签: python image python-imaging-library

我有一个图像(使用img = ImageGrab.grab( box )得到)并且我希望用白色替换某个RGB值的所有像素(精确地为rgb(74,38,63)),其余的用黑色替换。

问题是图像是RGB格式的,如果它是在单个波段中(正如我之前在程序中那样)我可以使用:img2 = img.point (lambda i: i>254 and 255);但这不适用于rgb图像, img.point中的i似乎不是3个整数的元组(正如我希望的那样)它只是数字0到255(如果我没有在某个地方弄乱的话)。



请注意,我不想使用.getpixel()方法,因为它对我想做的事情来说太慢了。

我的问题的一个替代方案是使用img.load()然后自己处理像素矩阵,但我不知道这是多么有效。

1 个答案:

答案 0 :(得分:0)

Numpy适用于广义快速和特定像素操作。这是一个例子:

enter image description here

import Image
import numpy as np
import matplotlib.pyplot as plt

im = Image.open("python.jpg")
a = np.asarray(im)

b = np.where(np.all(((a>[240, 40, 20]) * (a<=[255, 255, 150])), axis=2, keepdims=True), [80,0,0], [0,0,90])

plt.figure()
plt.subplot(1,2,1)
plt.imshow(a)
plt.subplot(1,2,2)
plt.imshow(b)
plt.show()

这里我转换了一系列像素值而不是单个值。要执行单个值,请删除使用==而不是>,并仅使用一个条件。另外,我使用matplotlib以简单的方式显示输出和输入,但您也可以使用Image.fromarray(b.astype(np.uint8))转换回图像。

如果您想要应用一些简单的标准过滤器或使用本地getpixel操作,保持纯PIL将正常工作,但对于图像,numpy或图像处理包的大多数数字工作是可行的方法。

相关问题